]> diplodocus.org Git - nmh/commitdiff
In cpstripped(), check for negative return value from wcwidth().
authorDavid Levine <levinedl@acm.org>
Tue, 14 Jan 2014 02:08:55 +0000 (20:08 -0600)
committerDavid Levine <levinedl@acm.org>
Tue, 14 Jan 2014 02:08:55 +0000 (20:08 -0600)
sbr/fmt_scan.c
test/scan/test-scan-multibyte

index fe2a00449410c709eb36b7300d4a41f6bacea648..9b84861cb123b25f5e4cbc71e2e3494caa33f6c1 100644 (file)
@@ -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.
             */
             * 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;
            }
 
                *ep += char_len - w;
            }
 
-           if (cp + w > *ep)
+           if (w >= 0  &&  cp + w > *ep)
                break;
 
            end -= char_len;
                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).
         */
         * 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;
        }
 
            *end += char_len - w;
        }
 
index f1407f63c7c96cb3324af2fd8cad544f41a75e02..9be8acb0812d7f65e49c2d0ed64c682c273aae81 100755 (executable)
@@ -136,4 +136,25 @@ LC_CTYPE=en_US.UTF-8 MM_CHARSET=UTF-8 scan -width 75 last >"$actual"
 check "$expected" "$actual"
 
 
 check "$expected" "$actual"
 
 
+cat >"$expected" <<EOF
+  13  01/13 sender@example.co  <<The Subject: is an encoded single quote, 0x92.
+EOF
+
+cat >"${MH_TEST_DIR}/Mail/inbox/13" <<EOF
+From: <sender@example.com>
+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
 exit $failed