Conquest 1.5.0f released

  • Hi Conquest users and friends,

    This is the 1.5.0d release. It fixes some bugs.

    You can download the release here:

    https://www.natura-ingenium.nl/dicomserver/dicomserver150f.zip

    This is the corresponding Github commit for 1.5.0e:

    https://github.com/marcelvanherk/…6674ae3578a3ac4

    As usual you can update by extracting dgate.exe or dgate64.exe and conquestdicomserver.exe, but also quite a few other files have changed - mainly in the web interface and lua code. The web interface no longer supports cgi, but uses PhP instead.

    The latest source code (1.5.0f+) can be browsed on: https://github.com/marcelvanherk/Conquest-DICOM-Server

    Please report bugs and successes!

    Marcel van Herk

    Marcel van Herk is developer of the Conquest DICOM server together with Lambert Zijp.

  • This is the buglist, starting with leftover bugs from earlier versions, per category:


    GUI bugs:

    G1) browse tab does not work if user of server service and server gui are differerent. This is due to use of a temp file in a user folder that is inaccessible by another user. Solution is to move the temp file location or change access of user\appData\temp

    Web interface bugs:

    DICOM Communication bugs:

    C1) Multiple instance matching incomplete

    Installer bugs or limitations (low priority):

    I1) last line of dicom.ini does not read if no CR - futured

    I2) web installer should copy OHIF (in github) and luiz html folders and compile servertask

    I3) Web installer on windows does not offer a 'regen' by itself

    I4) Fedora uses /var/www, and nohup has an issue. Therefore provide specific web install scripts for other linux flavours, e.g. fedora.sh. Fedora also requires "sudo setenforce Permissive" for the web server and install to work; also acrnema.map must be copied locally to the cgi-bin/newweb folder rather than pointing to the server folder.

    I5) Oracle linux issues see below; add mysql/mariadb option

    I6) Running ConquestDicomserver from wine with dgate as linux service issues, replace c: temp filenames with z:/

    Unconfirmed bugs:

    U1) I was also expecting DicomObject:Read('stu\ser\sop') to work with virtual servers but I tested it again and sadly no luck there

    U2) Show header in wadoviewer (wado text) open sometimes as dgate.exe downloads

    U3) App/newweb may add HTML header to zip files if using userlogin (not confirmed)

    U4) Random ***No valid presentation contexts/transfer syntax found in 0 candidates, in dicomget from web interface

    Open bugs:

    Below ---- newly found bugs for 1.5.0f will be collected

    N1) Too long queries do not give a proper error message in GUI

    N2) Dicom printing from script or gui fails for compressed images

    N3) print text from lua should fail gracefully for too long output

    N4) Internal networking is unreliable on Centos7

    N5) data processed though incoming has CallingAE of 16 spaces in ImportConverter

    N6) export:xx,,,,binary does not work

    N7) Change or modify should not allow empty patientIDs

    N8) Update license to Apache

    N9) The GUI ignores ACRNemaMap in dicom.ini

    N10) The supplied postgress DLL uses a deprecated login method can use libcrypto-3-x64.dll; libiconv-2.dll; libintl-9.dll; libpq(64).dll; libssl-3-x64.dll; libwinpthread-1.dll from recent release

    N11) I think autodelete only works when there is a single MAG device (-ff option).

    N12) the filenames in overview.lua are only suitable for windows

    N13) update or remove outdated or unused viewer start files (e.g. weasis)

    N14) support minimal download eg without sources

    N15) deleting e.g. a RTPLAN from a study does not update StudyModality. Will not fix.

    N16) The clonedb: test command requires VirtualServerFor0 to be defined

    N17) document that you must pass empty string (not nil) to changeuid to parameter if you want to use stage

    N18) * in query does not match empty data; lua:if Data.AccessionNumber=='*' then Data.AccessionNumber = '' end

    N19) User had difficulty blocking C-GET functionality. Confirmed 1.2.840.10008.5.1.4.1.2.2.3 is not checked in dgatesop.lst

    N20) group lenghts of groups with sequences are not stored correctly (lsp). Suggest to no longer store group lenghts in files

    N21) mukoya: jl20 causes image corruption

    N22) Add thread number to log output

    ----- 1.5.0f release -----

    N23) Issue with .configure of jpeg library build (gcc not working) on latest debian 13.0 (added non-jpeg updatelinux-docker) - circumvented on Git

    N24) Potential issue deleting nested sequences. Not reproduced.

    N25) Ladle crashes sometime in line 193 with variable a being null. Fixed on Git

    N26) Built-webserver does not run on 32 bits machine due to 64 bits socket dll

    N27) On install change default port in zerobranestudio interpreters

    N28) On Wine the server gives an errant message 'server is already running on the port' o first install. Workaround: push save config, close ConquestDicomserver.exe, open ConquestDicomserver.exe, go back to install page and continue. The issue relates to ports staying occupied after killing dgate.exe. Apart from this install issue Conquest runs great under wine (as a more user friendly alternative than running it under native Linix).

    N29) issue in prefetch queue found bij Martijn B truncating long scripts pass to delayed "process by". Fixed on Git

    N30) .7 files are considered as .7z. Fixed on Git

    N31) 6 errors mishandling tm_mon (starts at 0 not 1); fixes 'offset dates by ' and improves now and age clauses in import and export converters and in archiving. Fixed on Git

    N32) Very high concurrency caused failed connect() and therefore failed servercommand call. Under investigation

    N33) settings DelayedForwarderThreads higher than 1 is not working correctly; see detailed post in this thread.

    N34) built-in webserver crashes dgate under service, when local service login is used. Works with user login. Also need to document internal web server autostart line

    Please tell me of any bugs you find.

    Marcel van Herk is developer of the Conquest DICOM server together with Lambert Zijp.

    Edited 20 times, last by marcelvanherk (April 23, 2026 at 11:06 PM).

  • Feature requests:

    1) Add: " { 0x0010, 0x21d0, "LastMenstrualDate", 8, SQL_C_DATE, DT_DATE, "---" }, "

    I am a bit reluctant to do this as this may require a database update when updating.

    2) Add tag editor. Have started on integrating wxwidgets to allow lua scripting complex user interfaces. WIP.

    3) Let newdicomobject accept a binary string to load a dicom object from memory.

    4) Change the PostgreSQL Authentication Method to md5: Update the pg_hba.conf file to use md5 instead of scram-sha-256 for the relevant connections

    Code: host all all 127.0.0.1/32 md5

    Set password_encryption to md5 in PostgreSQL: In the postgresql.conf file, set the following parameter: password_encryption = md5

    Restart PostgreSQL and update the user password.

    5) Auto delete zipped log files after xx days

    6) Add option to lua dicomstore to set calling and called AE.

    7) Install web api and app under AE title of server

    8 ) Add option to offset dates in dicom object as part of anonymization (on Git)

    9) Add SQLITE backup api access from Lua

    Marcel

    Marcel van Herk is developer of the Conquest DICOM server together with Lambert Zijp.

    Edited 4 times, last by marcelvanherk (April 25, 2026 at 2:33 PM).

  • Hi.

    I changed the IP address on the server and left it running as an archive. I created a new server and started it up, giving it the address of the previous one. Now, when I access the server/archive in the browser, I see new studies appearing, even though I checked the system and found none. Could you please tell me where else I need to adjust the archive's operation?

    Thank you!

  • Thanks for the quick response!
    The configuration settings are all set to default. In the web version of the archive, when I search for studies for a week, I see studies stored on a different server. What can I do in this case?

  • Well that must mean config.php (or dicom.ini in the webserver for older web versions) points to the old server. The default is IP 127.0.0.1 and 5678, that will definitively point to the server on the same machine the webserver is on. What conquest version are you using and what web interface?

    Marcel van Herk is developer of the Conquest DICOM server together with Lambert Zijp.

  • Hello,

    I had a problem with the ExportConverter where automatic forwarding failed while manual C-MOVE from the web interface worked perfectly. My programming skills are limited, so I used Claude Code (Anthropic's AI coding assistant) to analyze the source code and track down the root cause. The fix was confirmed working on our system. I also used this issue as a test case for Claude Code. It was an interesting experience - neither Claude nor I would have been able to solve the problem alone.

    Symptom:
    - PacsTrouble.log: ExportConverter0.0: Forward failed to connect to host from productive Conquest environment (Win 7) to new environment (Win 10)
    - Receiving server log: No valid presentation contexts/transfer syntax found in 0 candidates / In 0 presentation contexts
    - Occasional server crashes with "error 7" (heap corruption)
    - C-MOVE from web GUI worked fine to the same destination

    Root cause explained by AI (claude):

    We analyzed the source code included in the standard Conquest 1.5.0f distribution (extracted from the installer, found under src/dgate/src/dgate.cpp).

    In CallExportConverterN (search for part = 0, around line 5040) the variable part is initialized to 0 and never changed. All threads therefore always use PDU[0].

    The static array ForwardPDU[MAXExportConverters][MAXExportConverters] (search for that string, around line 11470) is passed to new_queue() as ForwardPDU[N]. The comment reads "max 20×20 with remaining association", suggesting part
    was intended to differ per thread — but the assignment is missing.

    new_queue() starts exactly DelayedForwarderThreads threads (search for that string, around line 11405), all sharing the same queue and therefore the same ForwardPDU[N][0] object.

    The race condition:

    When DelayedForwarderThreads > 1, multiple threads concurrently call Connect() on the same PDU object. Inside Connect() (pdu.cxx), AAssociateRQ::ClearPresentationContexts() is called first, followed by a loop that rebuilds the presentation contexts from ProposedAbstractSyntaxs. If a second thread enters Connect() while the first is still in that loop, it clears the presentation contexts mid-build. The resulting A-ASSOCIATE-RQ is sent with 0 presentation contexts and the remote server rejects it. The concurrent modifications to the same Array objects also cause heap corruption (the "error 7" crashes).

    C-MOVE works because it uses a local PDU2 object per request — no sharing between threads.

    Fix:

    Set DelayedForwarderThreads = 1 in dicom.ini. With a single thread all queue processing is sequential and the race condition cannot occur. This appears to be a bug in Conquest: DelayedForwarderThreads > 1 is not safe with the current implementation. Until the code assigns different part values per thread, this setting must be kept at 1.

    Conquest version: 1.5.0f, 64-bit, Windows

    Kind regards Jörg

    (authorship edited)

    Edited 3 times, last by jjoerg (April 5, 2026 at 10:01 AM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!