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>
({ \
__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 \
{ \
printf ("'\n"); \
} \
\
- *errp = err; \
+ *errp = errx; \
match; \
})