Module Name:    src
Committed By:   uwe
Date:           Sun Jul 28 00:52:00 UTC 2019

Modified Files:
        src/lib/libcurses: slk.c

Log Message:
__slk_set_finalise - fix length vs. width confusion


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/lib/libcurses/slk.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libcurses/slk.c
diff -u src/lib/libcurses/slk.c:1.7 src/lib/libcurses/slk.c:1.8
--- src/lib/libcurses/slk.c:1.7	Sun Jul 28 00:15:38 2019
+++ src/lib/libcurses/slk.c	Sun Jul 28 00:51:59 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: slk.c,v 1.7 2019/07/28 00:15:38 uwe Exp $	*/
+/*	$NetBSD: slk.c,v 1.8 2019/07/28 00:51:59 uwe Exp $	*/
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: slk.c,v 1.7 2019/07/28 00:15:38 uwe Exp $");
+__RCSID("$NetBSD: slk.c,v 1.8 2019/07/28 00:51:59 uwe Exp $");
 #endif				/* not lint */
 
 #include <ctype.h>
@@ -719,7 +719,7 @@ static int
 __slk_set_finalise(SCREEN *screen, int labnum)
 {
 	struct __slk_label *l;
-	size_t spc, len, x;
+	size_t spc, len, width, x;
 	char *p;
 
 	l = &screen->slk_labels[labnum];
@@ -727,24 +727,34 @@ __slk_set_finalise(SCREEN *screen, int l
 
 #ifdef HAVE_WCHAR
 	len = 0;
+	width = 0;
 	if (l->text != NULL) {
-		wchar_t wc;
+		size_t plen;
 
 		p = l->text;
+		plen = strlen(l->text);
 		while (*p != '\0') {
-			if ((x = mbrtowc(0, p, strlen(p), &screen->sp)) == -1)
+			size_t mblen;
+			wchar_t wc;
+			int w;
+
+			mblen = mbrtowc(&wc, p, plen, &screen->sp);
+			if ((ssize_t)mblen < 0)
 				return ERR;
-			mbrtowc(&wc, p, x, &screen->sp);
-			if (len + wcwidth(wc) > spc)
+			w = wcwidth(wc);
+			if (width + w > spc)
 				break;
-			len += wcwidth(wc);
-			p += x;
+			width += w;
+			len += mblen;
+			p += mblen;
+			plen -= mblen;
 		}
 	}
 #else
 	len = l->text == NULL ? 0 : strlen(l->text);
 	if (len > spc)
 		len = spc;
+	width = len;
 #endif
 
 	switch(l->justify) {
@@ -752,12 +762,12 @@ __slk_set_finalise(SCREEN *screen, int l
 		x = 0;
 		break;
 	case SLK_JUSTIFY_CENTER:
-		x = (spc - len) / 2;
-		if (x + len > spc)
+		x = (spc - width) / 2;
+		if (x + width > spc)
 			x--;
 		break;
 	case SLK_JUSTIFY_RIGHT:
-		x = spc - len;
+		x = spc - width;
 		break;
 	default:
 		return ERR; /* impossible */
@@ -772,7 +782,7 @@ __slk_set_finalise(SCREEN *screen, int l
 	if (len != 0) {
 		memcpy(p, l->text, len);
 		p += len;
-		spc -= len;
+		spc -= width;
 	}
 	if (spc != 0) {
 		memset(p, ' ', spc);

Reply via email to