[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