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 <adhemerval.zanella@linaro.org>
This commit is contained in:
Maciej W. Rozycki 2025-08-11 17:42:12 +01:00
parent 1c1f5e8f6d
commit bc5cf78543
1 changed files with 5 additions and 5 deletions

View File

@ -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; \
})