From dd71754d10ee6e7953e9ccc06d5e9feb1ffed0bc Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Fri, 11 Mar 2022 21:18:33 +0100 Subject: [PATCH] AK: Properly parse unimplemented format length specifiers This keeps us from stopping early and not rendering the argument at all. --- AK/PrintfImplementation.h | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/AK/PrintfImplementation.h b/AK/PrintfImplementation.h index 032510503a8..44cbc62ba32 100644 --- a/AK/PrintfImplementation.h +++ b/AK/PrintfImplementation.h @@ -318,8 +318,12 @@ struct ModifierState { unsigned field_width { 0 }; bool has_precision { false }; unsigned precision { 6 }; + unsigned short_qualifiers { 0 }; // TODO: Unimplemented. unsigned long_qualifiers { 0 }; - bool size_qualifier { false }; + bool intmax_qualifier { false }; // TODO: Unimplemented. + bool ptrdiff_qualifier { false }; // TODO: Unimplemented. + bool long_double_qualifier { false }; // TODO: Unimplemented. + bool size_qualifier { false }; // TODO: Unimplemented. bool alternate_form { 0 }; bool always_sign { false }; }; @@ -499,14 +503,28 @@ ALWAYS_INLINE int printf_internal(PutChFunc putch, IdentityType* buffe if (*(p + 1)) goto one_more; } + if (*p == 'h') { + ++state.short_qualifiers; + if (*(p + 1)) + goto one_more; + } if (*p == 'l') { ++state.long_qualifiers; if (*(p + 1)) goto one_more; } + if (*p == 'j') { + state.intmax_qualifier = true; + if (*(p + 1)) + goto one_more; + } + if (*p == 't') { + state.ptrdiff_qualifier = true; + if (*(p + 1)) + goto one_more; + } if (*p == 'L') { - // TODO: Implement this properly. - // For now just swallow, so the contents are actually rendered. + state.long_double_qualifier = true; if (*(p + 1)) goto one_more; }