From 838ebcb78f1981dabf17a39f9114a06425aaadb5 Mon Sep 17 00:00:00 2001 From: Andrew Wood Date: Sun, 8 Dec 2024 16:18:58 +0000 Subject: [PATCH] Improve the handling of dangling or invalid "%" sequences. --- docs/NEWS.md | 1 + po/cs.po | 4 ++-- po/de.po | 4 ++-- po/es.po | 4 ++-- po/fr.po | 4 ++-- po/pl.po | 4 ++-- po/pt.po | 4 ++-- po/ru.po | 4 ++-- po/tr.po | 4 ++-- src/pv/display.c | 34 ++++++++++++++++++++++++++-------- 10 files changed, 43 insertions(+), 24 deletions(-) diff --git a/docs/NEWS.md b/docs/NEWS.md index d2afeb8..d0a886d 100644 --- a/docs/NEWS.md +++ b/docs/NEWS.md @@ -6,6 +6,7 @@ * *fix:* add _configure_ script fallback for **--remote** check when cross-compiling (#120) * *fix:* allow **extra-display** to be changed by **--remote** (#123) * *cleanup:* refactored display formatters into separate functions + * *cleanup:* improve format parser handling of dangling or invalid "%" sequences ### 1.9.7 - 2 December 2024 diff --git a/po/cs.po b/po/cs.po index 26a271a..f31d8bc 100644 --- a/po/cs.po +++ b/po/cs.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "PO-Revision-Date: 2024-10-13 20:43+0000\n" "Last-Translator: mmatous \n" "Language-Team: Czech \n" @@ -433,7 +433,7 @@ msgstr "b" msgid "B" msgstr "B" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "selhala alokace vyrovnávací paměti" diff --git a/po/de.po b/po/de.po index 3cd332f..58baa1e 100644 --- a/po/de.po +++ b/po/de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "PO-Revision-Date: 2024-10-13 20:43+0000\n" "Last-Translator: fnetX \n" "Language-Team: German \n" @@ -456,7 +456,7 @@ msgstr "b" msgid "B" msgstr "B" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "Speicherzuweisung für den Puffer fehlgeschlagen" diff --git a/po/es.po b/po/es.po index b22a96f..eda3ac2 100644 --- a/po/es.po +++ b/po/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -425,7 +425,7 @@ msgstr "" msgid "B" msgstr "" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "" diff --git a/po/fr.po b/po/fr.po index 5814a00..f5b3946 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "PO-Revision-Date: 2024-10-12 11:13+0000\n" "Last-Translator: a-j-wood \n" "Language-Team: French \n" @@ -460,7 +460,7 @@ msgstr "" msgid "B" msgstr "O" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "échec de l'allocation de mémoire tampon" diff --git a/po/pl.po b/po/pl.po index 0ba11e7..6bede44 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "PO-Revision-Date: 2024-10-20 14:07+0000\n" "Last-Translator: coralpink \n" "Language-Team: Polish \n" @@ -451,7 +451,7 @@ msgstr "b" msgid "B" msgstr "B" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "nie udało się zaalokować bufora" diff --git a/po/pt.po b/po/pt.po index 00a7d13..efb4015 100644 --- a/po/pt.po +++ b/po/pt.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -439,7 +439,7 @@ msgstr "" msgid "B" msgstr "" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "erro alocando o buffer" diff --git a/po/ru.po b/po/ru.po index d85400b..ac9b022 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "PO-Revision-Date: 2024-10-22 18:07+0000\n" "Last-Translator: 0ko <0ko@users.noreply.translate.codeberg.org>\n" "Language-Team: Russian \n" @@ -434,7 +434,7 @@ msgstr "бит" msgid "B" msgstr "байт" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "не удалось выделить память для буфера" diff --git a/po/tr.po b/po/tr.po index b011f45..af93ae4 100644 --- a/po/tr.po +++ b/po/tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: pv 1.8.14\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 15:56+0000\n" +"POT-Creation-Date: 2024-12-08 16:17+0000\n" "PO-Revision-Date: 2024-10-12 23:51+0000\n" "Last-Translator: a-j-wood \n" "Language-Team: Turkish \n" @@ -435,7 +435,7 @@ msgstr "b" msgid "B" msgstr "B" -#: src/pv/display.c:1467 src/pv/transfer.c:1064 +#: src/pv/display.c:1485 src/pv/transfer.c:1064 msgid "buffer allocation failed" msgstr "arabellek tahsisi başarısız oldu" diff --git a/src/pv/display.c b/src/pv/display.c index 89682d0..4856be9 100644 --- a/src/pv/display.c +++ b/src/pv/display.c @@ -1271,11 +1271,12 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp if ('%' == display_format[strpos]) { unsigned long number_prefix; - size_t sequence_start, sequence_length; + size_t percent_sign_offset, sequence_start, sequence_length; #if HAVE_STRTOUL char *number_end_ptr; #endif + percent_sign_offset = strpos; strpos++; /* @@ -1286,10 +1287,11 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp #if HAVE_STRTOUL number_end_ptr = NULL; number_prefix = strtoul(&(display_format[strpos]), &number_end_ptr, 10); - if ((NULL == number_end_ptr) || (number_end_ptr[0] == '\0')) - break; - if (number_end_ptr > &(display_format[strpos])) + if ((NULL == number_end_ptr) || (number_end_ptr[0] == '\0')) { + number_prefix = 0; + } else if (number_end_ptr > &(display_format[strpos])) { strpos += (number_end_ptr - &(display_format[strpos])); + } #else /* !HAVE_STRTOUL */ while (isdigit((int) (display_format[strpos]))) { number_prefix = number_prefix * 10; @@ -1299,9 +1301,12 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp #endif /* !HAVE_STRTOUL */ sequence_start = strpos; - sequence_length = 1; + sequence_length = 0; + if ('\0' != display_format[strpos]) + sequence_length = 1; if ('{' == display_format[strpos]) { - while ('\0' != display_format[strpos] && '}' != display_format[strpos]) { + while ('\0' != display_format[strpos] && '}' != display_format[strpos] + && '%' != display_format[strpos]) { strpos++; sequence_length++; } @@ -1322,8 +1327,21 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp } if (-1 == component_type) { - str_start = sequence_start; - str_bytes = sequence_length; + /* Unknown sequence - pass it through verbatim. */ + str_start = percent_sign_offset; + str_bytes = sequence_length + sequence_start - percent_sign_offset; + + if (2 == str_bytes && '%' == display_format[percent_sign_offset + 1]) { + /* Special case: "%%" => "%". */ + str_bytes = 1; + } else if (str_bytes > 1 && '%' == display_format[strpos]) { + /* Special case: "%{foo%p" => "%{foo" and go back one. */ + str_bytes--; + strpos--; + } else if (str_bytes == 0 && '\0' == display_format[strpos]) { + /* Special case: "%" at end of string = "%". */ + str_bytes = 1; + } } else { chosen_size = (size_t) number_prefix; }