Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: Fun fact: mbsrtowcs() does not nul terminate the string



---
This caused a few unpredictable bugs and problems, and also a metric
truckload of warnings from valgrind. Oops.

 Src/utils.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/Src/utils.c b/Src/utils.c
index 869accccdd..7499298ab5 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -4760,11 +4760,12 @@ set_keylayout(UNUSED(Param pm), char *x)
 	wmemset(&newkeymap[10*15], L'\n', 15);
 	newkeymap[165] = L'\0';
 	int line;
-	int xlen;
+	int xlen, wxlen;
 	unmetafy(x, &xlen);
 	wchar_t *wx = zalloc(sizeof(wchar_t) * (xlen + 1)), *wxp = wx;
 	const char *xr = x;
-	mbsrtowcs(wx, &xr, xlen, &mbs);
+	wxlen = mbsrtowcs(wx, &xr, xlen, &mbs);
+	wx[wxlen] = L'\0';
 
 	wchar_t *p = wx;
 	const size_t pos[] = { 15 + 2, 15*2 + 2, 15*3 + 2, 15*4 + 1, 15*6 + 2, 15*7 + 2, 15*8 + 2, 15*9 + 1 };
@@ -4811,10 +4812,13 @@ spdist(char *s, char *t, int thresh)
     mbstate_t mbs;
     wchar_t *wsp = ws, *wtp = wt;
 
+    int wslen, wtlen;
     memset(&mbs, 0, sizeof(mbs));
-    mbsrtowcs(ws, (const char**)&s, slen, &mbs);
+    wslen = mbsrtowcs(ws, (const char**)&s, slen, &mbs);
     memset(&mbs, 0, sizeof(mbs));
-    mbsrtowcs(wt, (const char**)&t, tlen, &mbs);
+    wtlen = mbsrtowcs(wt, (const char**)&t, tlen, &mbs);
+    ws[wslen] = L'\0';
+    wt[wtlen] = L'\0';
 
     int result = wcspdist(ws, wt, thresh);
     zfree(ws, sizeof(wchar_t) * (slen + 1));
-- 
2.38.1





Messages sorted by: Reverse Date, Date, Thread, Author