From dd3552bb2937a9263ee71d02dd65bbea4dea161c Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 22 Mar 2023 22:42:58 +0100 Subject: [PATCH] vasnprintf: Fix potentially wrong zero-padding. * lib/vasnprintf.c (VASNPRINTF): Fix zero-padding when the result starts with a prefix "0x" or "0b". --- ChangeLog | 6 ++++++ lib/vasnprintf.c | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/ChangeLog b/ChangeLog index 86321dbb06..bd06c2864d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2023-03-19 Bruno Haible + + vasnprintf: Fix potentially wrong zero-padding. + * lib/vasnprintf.c (VASNPRINTF): Fix zero-padding when the result starts + with a prefix "0x" or "0b". + 2023-03-19 Paul Eggert test-pselect, test-select: use different ports diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c index 1a30f20d82..10709da3f1 100644 --- a/lib/vasnprintf.c +++ b/lib/vasnprintf.c @@ -5595,6 +5595,22 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z') || (*pad_ptr >= 'a' && *pad_ptr <= 'z')) pad_ptr = NULL; + else + /* Do the zero-padding after the "0x" or + "0b" prefix, not before. */ + if (p - rp >= 2 + && *rp == '0' + && (((dp->conversion == 'a' + || dp->conversion == 'x') + && rp[1] == 'x') + || ((dp->conversion == 'A' + || dp->conversion == 'X') + && rp[1] == 'X') + || (dp->conversion == 'b' + && rp[1] == 'b') + || (dp->conversion == 'B' + && rp[1] == 'B'))) + pad_ptr += 2; } /* The generated string now extends from rp to p, with the zero padding insertion point being at -- 2.39.5