From bc5cf785436ad988fefce7e9ea6b6b4df2a094d2 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Mon, 11 Aug 2025 17:42:12 +0100 Subject: [PATCH] stdio-common: Fix macro parameter shadowing in scanf input specifier tests The use of the same name for a local variable combined with passing a pointer to it to a nested macro call causes the wrong 'err' variable to be updated in 'read_real', because '&err' is only expanded at '*errp' evaluation. Consequently the variable defined in 'read_real' is set rather than one in its 'verify_input' caller as it would be the case should 'read_real' be a function, leading to invalid input such as: %a:nan:1:3:nan(: to be accepted. Address the issue by renaming the 'err' variable in 'verify_input' to 'errx', causing such input to be correctly rejected: error: ./tst-scanf-format-skeleton.c:242: input line 1: input data format error No test case added as it's a test case issue in the first place. Reviewed-by: Adhemerval Zanella --- stdio-common/tst-scanf-format-real.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/stdio-common/tst-scanf-format-real.h b/stdio-common/tst-scanf-format-real.h index 639ac74973..ed7941849e 100644 --- a/stdio-common/tst-scanf-format-real.h +++ b/stdio-common/tst-scanf-format-real.h @@ -73,19 +73,19 @@ ({ \ __label__ out; \ bool match = true; \ - int err = 0; \ + int errx = 0; \ type_t v; \ \ initialize_value (v); \ /* Make sure it's been committed. */ \ __asm__ ("" : : : "memory"); \ - v = read_real (&err); \ - if (err < 0) \ + v = read_real (&errx); \ + if (errx < 0) \ goto out; \ match = compare_real (val, v); \ \ out: \ - if (err || !match) \ + if (errx || !match) \ { \ union \ { \ @@ -104,7 +104,7 @@ out: \ printf ("'\n"); \ } \ \ - *errp = err; \ + *errp = errx; \ match; \ })