kumquat-buildroot/package/uclibc/0.9.33.2/uclibc-0048-Fix-a-problem-with-scanning-wide-chars.patch
Peter Korsgaard 055f1c02d3 uclibc: add upstream 0.9.33 fixes
Upstream has a large number of patches lined up for the next 0.9.33.x bugfix
release;

http://git.uclibc.org/uClibc/log/?h=0.9.33

Add them here, as atleast some of them are quite critical (E.G. the eventfd
issue gets triggered by recent glib versions).

I've skipped the microblaze and xtensa fixes as we don't currently support
those with 0.9.33.2.

Drop uclibc-0002-Add-definition-of-MSG_WAITFORONE-and-MSG_CMSG_CMSG_CLOEXE.patch
as that is a subset of uclibc-0035-socket.h-pull-socket_type.h-from-eglibc.patch

Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
2013-09-06 15:28:51 +02:00

67 lines
1.9 KiB
Diff

From 12846e741d925630a4079ac02290b28c6f00b887 Mon Sep 17 00:00:00 2001
From: Nathan Sidwell <nathan@codesourcery.com>
Date: Fri, 22 Mar 2013 17:46:52 +0100
Subject: [PATCH] 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>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
---
libc/stdio/_scanf.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/libc/stdio/_scanf.c b/libc/stdio/_scanf.c
index 952853c..3848a09 100644
--- a/libc/stdio/_scanf.c
+++ b/libc/stdio/_scanf.c
@@ -429,8 +429,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,
@@ -921,7 +921,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;
--
1.7.10.4