Project

General

Profile

Bug #1197 » IC-DCMTK-0009_crash_output.txt

Jörg Riesmeier, 2026-03-25 10:09

 
=== Uninitialized Memory Read Evidence ===
Command: json2dcm --ignore-errors poc.json /dev/null
PoC size: 40 bytes
Build: clang -fsanitize=address,undefined (UBSan required)

$ json2dcm --ignore-errors poc.json /dev/null

dcjsonrd.cc:571:18: runtime error: load of value 3200171710,
which is not a valid value for type 'jsmntype_t'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
dcjsonrd.cc:571:18

The UBSan error confirms that at dcjsonrd.cc:571, the code loads
a value (3200171710 = 0xBEBDBEBE, an ASan poison pattern) from
the token's type field. This is heap garbage from an uninitialized
sentinel token past the end of the valid JSMN token array.

Note: This bug requires UBSan (-fsanitize=undefined) to detect.
ASan alone does not flag this because the read is within the
allocated token array's memory (the sentinel slot), not out of
bounds. The issue is that the sentinel token's type field was
never initialized by the JSMN tokenizer or by reserveTokens().

Root cause: reserveTokens() at dcjsonrd.cc:200 does:
memset(tokenArray_, 0, tokenNum * sizeof(OFJsmnToken));

This zeros the first tokenNum tokens, but the sentinel at
tokenArray_[tokenNum] (allocated via new[tokenNum+1]) has only
start, end, size explicitly set. The 'type' field is left
UNINITIALIZED.

When parseElement() at line 571 reads this uninitialized type:
switch(current->type) { ... }
UBSan detects the invalid enum value load.
(1-1/3)