The `%I64` printf format family is a Windows-specific extension that has been handled for, like, eternity in `mingw-w64-gettext`. But the recent update to v0.22.3 broke that. The reason for that is a story of two episodes: - gnulib slipped in a major refactoring of the `printf()` format parsing into a commit whose purpose was to support new size specifiers: https://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=480a59ba60fa0b43a1cebe218bbcea6a947f1e86 Unfortunately, the code handling `%I64` was converted incorrectly, where it previously skipped the `64` part before looking for the conversion specifier (correct) but now no longer does so (incorrect): https://git.savannah.gnu.org/cgit/gnulib.git/diff/lib/printf-parse.c?id=480a59ba60fa0b43a1cebe218bbcea6a947f1e86 - gettext saw a major refactoring with the intention to avoid duplicating gnulib's `printf()` logic, dropping its own code in favor of the latter: https://git.savannah.gnu.org/gitweb/?p=gettext.git;a=commitdiff;h=a80b9021019fe311b81771d67138496f512ef35a The result is that as of `mingw-w64-gettext` v0.22.3, `%I64d` is _started_ to be parsed but then fails because it mistakes `6` for the conversion character (instead of recognizing `d` as such). Work around this regression by skipping the `64` part again. This patch needs to be upstreamed to the gnulib project, yet we need to fix the `mingw-w64-gettext` regression at a more timely pace and need to integrate the patch early. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
37 lines
1.4 KiB
Diff
37 lines
1.4 KiB
Diff
From 45cd4b6d5f3db4ac26219ddde951fc09589e74a0 Mon Sep 17 00:00:00 2001
|
|
From: Johannes Schindelin <johannes.schindelin@gmx.de>
|
|
Date: Fri, 10 Nov 2023 12:16:02 +0100
|
|
Subject: [PATCH] printf_parse: fix off-by-two
|
|
|
|
In gnulib's 480a59ba60 (*printf-posix: ISO C 23: Support size specifiers
|
|
'wN' and 'wfN'., 2023-03-24), a major refactoring hides a bug in the
|
|
conversion of the code handling Windows' `%I64*` family of `printf()`
|
|
formats: before the refactoring, the `64` part was skipped (as desired),
|
|
but afterwards that part is not skipped and therefore the `6` is
|
|
mistaken for a conversion character. Which is invalid, of course,
|
|
causing the code to error out.
|
|
|
|
Fix this by skipping the `64` part again.
|
|
|
|
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
|
|
---
|
|
gettext-runtime/intl/gnulib-lib/printf-parse.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/gettext-runtime/intl/gnulib-lib/printf-parse.c b/gettext-runtime/intl/gnulib-lib/printf-parse.c
|
|
index d3f2c3cb5d..6741ee5ff4 100644
|
|
--- a/gettext-runtime/intl/gnulib-lib/printf-parse.c
|
|
+++ b/gettext-runtime/intl/gnulib-lib/printf-parse.c
|
|
@@ -555,7 +555,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
|
unsigned_type = TYPE_ULONGINT;
|
|
pointer_type = TYPE_COUNT_LONGINT_POINTER;
|
|
}
|
|
- cp++;
|
|
+ cp += 3;
|
|
}
|
|
#endif
|
|
|
|
--
|
|
2.43.0.rc1.windows.1
|
|
|