]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
stdio-common: Fix macro parameter shadowing in scanf input specifier tests
authorMaciej W. Rozycki <macro@redhat.com>
Mon, 11 Aug 2025 16:42:12 +0000 (17:42 +0100)
committerMaciej W. Rozycki <macro@redhat.com>
Mon, 11 Aug 2025 16:42:12 +0000 (17:42 +0100)
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>
stdio-common/tst-scanf-format-real.h

index 639ac749735886a2663df50f75645b1a4b69caa3..ed7941849eca0b90cd42c44628dc21df4467624b 100644 (file)
 ({                                                                     \
   __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;                                                               \
 })