Skip to content

inspect-library: Don't print non-ASCII as nonsense codepoints

Simon McVittie requested to merge wip/sr385-non-codepoints into master

If we pass a (signed) char to a varargs function, it's promoted to (signed) int by the default argument promotions (resulting in padding on the left by copying the sign bit); but then %x interprets it as an unsigned int. The practical result is that for anything over 0x7f, for example 0xAB, we interpret the high bit as the sign bit and pad with "1" bits, turning 0xAB into 0xFFFFFFAB. \uFFFFFFAB is not allowed as an escaped JSON character (because Unicode stops at U+10FFFF) so parsing fails.

Note that this change does not result in strings with non-ASCII content being interpreted correctly: we are effectively taking the bytestring from the OS and decoding it as though it was ISO-8859-1, so if a file's path includes U+00C7 LATIN CAPITAL_LETTER C WITH CEDILLA (Ç), encoded as 0xC3 0x87 on disk (assuming a UTF-8 environment), it will go into the JSON document as \u00C3\u0087 instead of the correct \u00C7. Fixing this would require either a considerably more complex implementation of inspect-library, or an output format that is based on bytestrings rather than JSON.

Partially addresses https://github.com/ValveSoftware/steam-runtime/issues/385 and #69 (closed).

Merge request reports