py/mpprint: Fix length calculation for strings with precision-modifier.

Two issues are tackled:

1. The calculation of the correct length to print is fixed to treat the
   precision as a maximum length instead as the exact length.
   This is done for both qstr (%q) and for regular str (%s).

2. Fix the incorrect use of mp_printf("%.*s") to mp_print_strn().

   Because of the fix of above issue, some testcases that would print
   an embedded null-byte (^@ in test-output) would now fail.
   The bug here is that "%s" was used to print null-bytes. Instead,
   mp_print_strn is used to make sure all bytes are outputted and the
   exact length is respected.

Test-cases are added for both %s and %q with a combination of precision
and padding specifiers.
This commit is contained in:
Joris Peeraer
2020-10-22 10:38:03 +02:00
committed by Damien George
parent dde0735ac1
commit 5020b14d54
5 changed files with 12 additions and 11 deletions

View File

@@ -92,7 +92,7 @@ STATIC void uni_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t
}
#endif
if (kind == PRINT_STR) {
mp_printf(print, "%.*s", str_len, str_data);
print->print_strn(print->data, (const char *)str_data, str_len);
} else {
uni_print_quoted(print, str_data, str_len);
}