aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0059-fix-erroneous-stop-before-input-limit-in-mbsnrtowcs-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0059-fix-erroneous-stop-before-input-limit-in-mbsnrtowcs-.patch')
-rw-r--r--main/musl/0059-fix-erroneous-stop-before-input-limit-in-mbsnrtowcs-.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/main/musl/0059-fix-erroneous-stop-before-input-limit-in-mbsnrtowcs-.patch b/main/musl/0059-fix-erroneous-stop-before-input-limit-in-mbsnrtowcs-.patch
new file mode 100644
index 0000000000..65b1cab4c1
--- /dev/null
+++ b/main/musl/0059-fix-erroneous-stop-before-input-limit-in-mbsnrtowcs-.patch
@@ -0,0 +1,78 @@
+From 11ddc314b57196519316103b02acffe10299dad3 Mon Sep 17 00:00:00 2001
+From: Rich Felker <dalias@aerifal.cx>
+Date: Thu, 31 Aug 2017 14:30:28 -0400
+Subject: [PATCH 1/2] fix erroneous stop before input limit in mbsnrtowcs and
+ wcsnrtombs
+
+the value computed as an output limit that bounds the amount of input
+consumed below the input limit was incorrectly being used as the
+actual amount of input consumed. instead, compute the actual amount of
+input consumed as a difference of pointers before and after the
+conversion.
+
+patch by Mikhail Kremnyov.
+---
+ src/multibyte/mbsnrtowcs.c | 4 +++-
+ src/multibyte/wcsnrtombs.c | 4 +++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/multibyte/mbsnrtowcs.c b/src/multibyte/mbsnrtowcs.c
+index cae4caa2..931192e2 100644
+--- a/src/multibyte/mbsnrtowcs.c
++++ b/src/multibyte/mbsnrtowcs.c
+@@ -5,6 +5,7 @@ size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, si
+ size_t l, cnt=0, n2;
+ wchar_t *ws, wbuf[256];
+ const char *s = *src;
++ const char *tmp_s;
+
+ if (!wcs) ws = wbuf, wn = sizeof wbuf / sizeof *wbuf;
+ else ws = wcs;
+@@ -15,7 +16,7 @@ size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, si
+
+ while ( s && wn && ( (n2=n/4)>=wn || n2>32 ) ) {
+ if (n2>=wn) n2=wn;
+- n -= n2;
++ tmp_s = s;
+ l = mbsrtowcs(ws, &s, n2, st);
+ if (!(l+1)) {
+ cnt = l;
+@@ -26,6 +27,7 @@ size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, si
+ ws += l;
+ wn -= l;
+ }
++ n = s ? n - (s - tmp_s) : 0;
+ cnt += l;
+ }
+ if (s) while (wn && n) {
+diff --git a/src/multibyte/wcsnrtombs.c b/src/multibyte/wcsnrtombs.c
+index 640cbbeb..676932b5 100644
+--- a/src/multibyte/wcsnrtombs.c
++++ b/src/multibyte/wcsnrtombs.c
+@@ -5,13 +5,14 @@ size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, s
+ size_t l, cnt=0, n2;
+ char *s, buf[256];
+ const wchar_t *ws = *wcs;
++ const wchar_t *tmp_ws;
+
+ if (!dst) s = buf, n = sizeof buf;
+ else s = dst;
+
+ while ( ws && n && ( (n2=wn)>=n || n2>32 ) ) {
+ if (n2>=n) n2=n;
+- wn -= n2;
++ tmp_ws = ws;
+ l = wcsrtombs(s, &ws, n2, 0);
+ if (!(l+1)) {
+ cnt = l;
+@@ -22,6 +23,7 @@ size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, s
+ s += l;
+ n -= l;
+ }
++ wn = ws ? wn - (ws - tmp_ws) : 0;
+ cnt += l;
+ }
+ if (ws) while (n && wn) {
+--
+2.13.3
+