Skip to content
Snippets Groups Projects
Commit 869b7c0d authored by Simon McVittie's avatar Simon McVittie
Browse files

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

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

.

Signed-off-by: default avatarSimon McVittie <smcv@collabora.com>
parent 98b91310
No related branches found
No related tags found
1 merge request!278inspect-library: Don't print non-ASCII as nonsense codepoints
Pipeline #10580 passed
......@@ -485,11 +485,11 @@ main (int argc,
static void
print_json_string_content (const char *s)
{
const char *p;
const unsigned char *p;
for (p = s; *p != '\0'; p++)
for (p = (const unsigned char *) s; *p != '\0'; p++)
{
if (*p == '"' || *p == '\\' || *p <= 0x1F)
if (*p == '"' || *p == '\\' || *p <= 0x1F || *p >= 0x80)
printf ("\\u%04x", *p);
else
printf ("%c", *p);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment