From: David Levine Date: Tue, 14 Jan 2014 02:08:55 +0000 (-0600) Subject: In cpstripped(), check for negative return value from wcwidth(). X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/13a5e00431c2452d008e5ea797958bb187c1f985?ds=sidebyside;hp=-c In cpstripped(), check for negative return value from wcwidth(). --- 13a5e00431c2452d008e5ea797958bb187c1f985 diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index fe2a0044..9b84861c 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -175,11 +175,11 @@ cptrimmed(char **dest, char **ep, char *str, unsigned int wid, char fill, * widths, so use the column width to bump the end pointer when * appropriate. */ - if (char_len > 1 && epmax - *ep >= char_len - w) { + if (w >= 0 && char_len > 1 && epmax - *ep >= char_len - w) { *ep += char_len - w; } - if (cp + w > *ep) + if (w >= 0 && cp + w > *ep) break; end -= char_len; @@ -278,7 +278,7 @@ cpstripped (char **dest, char **end, char *max, char *str) * by the number of "extra" bytes in this character. That's the * character length (char_len) minus the column width (w). */ - if (char_len > 1 && max - *end >= char_len - w) { + if (w >= 0 && char_len > 1 && max - *end >= char_len - w) { *end += char_len - w; } diff --git a/test/scan/test-scan-multibyte b/test/scan/test-scan-multibyte index f1407f63..9be8acb0 100755 --- a/test/scan/test-scan-multibyte +++ b/test/scan/test-scan-multibyte @@ -136,4 +136,25 @@ LC_CTYPE=en_US.UTF-8 MM_CHARSET=UTF-8 scan -width 75 last >"$actual" check "$expected" "$actual" +cat >"$expected" <"${MH_TEST_DIR}/Mail/inbox/13" < +Subject: =?iso-8859-1?B?kgo=?= +Date: Mon, 13 Jan 2014 14:18:33 -0600 + +The Subject: is an encoded single quote, 0x92. cpstripped() didn't +properly count it when decoding, which could be seen with: + + scan -format '%(decode{subject})%{body}' + +The scan listing was two characters too long. +EOF + +run_prog scan -width 80 last >"$actual" +check "$expected" "$actual" + + exit $failed