Forráskód Böngészése

Fix a problem with scanning wide chars.

We found that the testcase

int
main (void)
{
  wchar_t s[10];
  memset (s, 0, sizeof (s));
  int r = sscanf ("s", "%ls", s);
  printf ("%d\n", r);
  printf ("%ls\n", s);
  return 0;
}

printed
0
<blankline>

rather than the expected
1
s

The problem was the enum in _scanf.c, which has had a 'CONV_m' value
inserted. The attached patch fixes the problem in __psfs_parse_spec by
not presuming a particular displacement between the two sets of
char-like conversion values. With this patch the above program produces
the expected output.

Signed-off-by: Nathan Sidwell <nathan@codesourcery.com>
Signed-off-by: Bernd Schmidt <bernds@codesourcery.com>
Nathan Sidwell 11 éve
szülő
commit
697427cc42
1 módosított fájl, 3 hozzáadás és 3 törlés
  1. 3 3
      libc/stdio/_scanf.c

+ 3 - 3
libc/stdio/_scanf.c

@@ -426,8 +426,8 @@ libc_hidden_def(vswscanf)
 /*                       npxXoudif eEgG  CS  cs[ */
 /* NOTE: the 'm' flag must come before any convs that support it */
 
-/* NOTE: Ordering is important!  In particular, CONV_LEFTBRACKET
- * must immediately precede CONV_c. */
+/* NOTE: Ordering is important!  The CONV_{C,S,LEFTBRACKET} must map
+   simply to their lowercase equivalents.  */
 
 enum {
 	CONV_n = 0,
@@ -918,7 +918,7 @@ int attribute_hidden __psfs_parse_spec(register psfs_t *psfs)
 				psfs->dataargtype = PA_FLAG_LONG;
 			} else if ((p_m_spec_chars >= CONV_c)
 				&& (psfs->dataargtype & PA_FLAG_LONG)) {
-				p_m_spec_chars -= 3; /* lc -> C, ls -> S, l[ -> ?? */
+				p_m_spec_chars -= CONV_c - CONV_C; /* lc -> C, ls -> S, l[ -> ?? */
 			}
 
 			psfs->conv_num = p_m_spec_chars;