[PATCH v2 07/14] stdio-common: Fix macro parameter shadowing in scanf input specifier tests
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Thu Aug 7 18:12:11 GMT 2025
On 05/06/25 14:58, Maciej W. Rozycki wrote:
> From: Maciej W. Rozycki <macro@redhat.com>
>
> 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.
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> No change from v1.
> ---
> stdio-common/tst-scanf-format-real.h | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> glibc-tst-scanf-format-all-real-verify-err-fix.diff
> Index: glibc/stdio-common/tst-scanf-format-real.h
> ===================================================================
> --- glibc.orig/stdio-common/tst-scanf-format-real.h
> +++ glibc/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; \
> })
>
More information about the Libc-alpha
mailing list