Skip to content
Snippets Groups Projects
  • Simon McVittie's avatar
    869b7c0d
    inspect-library: Don't print non-ASCII as nonsense codepoints · 869b7c0d
    Simon McVittie authored
    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
    https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/issues/69
    
    .
    
    Signed-off-by: default avatarSimon McVittie <smcv@collabora.com>
    869b7c0d
    History
    inspect-library: Don't print non-ASCII as nonsense codepoints
    Simon McVittie authored
    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
    https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/issues/69
    
    .
    
    Signed-off-by: default avatarSimon McVittie <smcv@collabora.com>