Loading...
--- /dev/null
+++ Libc/Libc-498/stdio/FreeBSD/vswscanf.c.patch
@@ -0,0 +1,78 @@
+--- vswscanf.c.orig 2004-11-25 11:38:36.000000000 -0800
++++ vswscanf.c 2005-02-23 17:03:30.000000000 -0800
+@@ -43,6 +43,8 @@
+ #endif
+ __FBSDID("$FreeBSD: src/lib/libc/stdio/vswscanf.c,v 1.3 2004/04/07 09:55:05 tjr Exp $");
+
++#include "xlocale_private.h"
++
+ #include <limits.h>
+ #include <stdarg.h>
+ #include <stdio.h>
+@@ -71,15 +73,55 @@
+ char *mbstr;
+ size_t mlen;
+ int r;
++ locale_t loc = __current_locale();
++
++ /*
++ * XXX Convert the wide character string to multibyte, which
++ * __vfwscanf() will convert back to wide characters.
++ */
++ if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX_L(loc) + 1)) == NULL)
++ return (EOF);
++ mbs = initial;
++ if ((mlen = wcsrtombs_l(mbstr, &str, SIZE_T_MAX, &mbs, loc)) == (size_t)-1) {
++ free(mbstr);
++ return (EOF);
++ }
++ f._file = -1;
++ f._flags = __SRD;
++ f._bf._base = f._p = (unsigned char *)mbstr;
++ f._bf._size = f._r = mlen;
++ f._read = eofread;
++ f._ub._base = NULL;
++ f._lb._base = NULL;
++ f._extra = &ext;
++ INITEXTRA(&f);
++ r = __vfwscanf(&f, loc, fmt, ap);
++ free(mbstr);
++
++ return (r);
++}
++
++int
++vswscanf_l(const wchar_t * __restrict str, locale_t loc,
++ const wchar_t * __restrict fmt, va_list ap)
++{
++ static const mbstate_t initial;
++ mbstate_t mbs;
++ FILE f;
++ struct __sFILEX ext;
++ char *mbstr;
++ size_t mlen;
++ int r;
+
++ NORMALIZE_LOCALE(loc);
+ /*
+ * XXX Convert the wide character string to multibyte, which
+ * __vfwscanf() will convert back to wide characters.
+ */
+- if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX + 1)) == NULL)
++ if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX_L(loc) + 1)) == NULL)
+ return (EOF);
+ mbs = initial;
+- if ((mlen = wcsrtombs(mbstr, &str, SIZE_T_MAX, &mbs)) == (size_t)-1) {
++ if ((mlen = wcsrtombs_l(mbstr, &str, SIZE_T_MAX, &mbs, loc)) == (size_t)-1) {
+ free(mbstr);
+ return (EOF);
+ }
+@@ -92,7 +134,7 @@
+ f._lb._base = NULL;
+ f._extra = &ext;
+ INITEXTRA(&f);
+- r = __vfwscanf(&f, fmt, ap);
++ r = __vfwscanf(&f, loc, fmt, ap);
+ free(mbstr);
+
+ return (r);