]> granicus.if.org Git - vim/commitdiff
patch 9.0.0220: invalid memory access with for loop over NULL string v9.0.0220
authorBram Moolenaar <Bram@vim.org>
Tue, 16 Aug 2022 16:50:38 +0000 (17:50 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 16 Aug 2022 16:50:38 +0000 (17:50 +0100)
Problem:    Invalid memory access with for loop over NULL string.
Solution:   Make sure mb_ptr2len() consistently returns zero for NUL.

src/globals.h
src/mbyte.c
src/testdir/test_eval_stuff.vim
src/version.c

index 1fadc744f5fb5d3efb571a6c75ca8a724b57a859..21fabdbb517c8c7fa04c7572a97b129b9b3aa9c9 100644 (file)
@@ -1035,7 +1035,8 @@ EXTERN vimconv_T output_conv;                     // type of output conversion
  * (DBCS).
  * The value is set in mb_init();
  */
-// length of char in bytes, including following composing chars
+// Length of char in bytes, including any following composing chars.
+// NUL has length zero.
 EXTERN int (*mb_ptr2len)(char_u *p) INIT(= latin_ptr2len);
 
 // idem, with limit on string length
index 941411b4a940fd5b2341c191d58bb3658084bee8..73065c739459b59b0494cd7ad1c873553dd40002 100644 (file)
@@ -1077,24 +1077,28 @@ dbcs_char2bytes(int c, char_u *buf)
 }
 
 /*
- * mb_ptr2len() function pointer.
- * Get byte length of character at "*p" but stop at a NUL.
- * For UTF-8 this includes following composing characters.
- * Returns 0 when *p is NUL.
+ * Get byte length of character at "*p".  Returns zero when "*p" is NUL.
+ * Used for mb_ptr2len() when 'encoding' latin.
  */
     int
 latin_ptr2len(char_u *p)
 {
return MB_BYTE2LEN(*p);
   return *p == NUL ? 0 : 1;
 }
 
+/*
+ * Get byte length of character at "*p".  Returns zero when "*p" is NUL.
+ * Used for mb_ptr2len() when 'encoding' DBCS.
+ */
     static int
-dbcs_ptr2len(
-    char_u     *p)
+dbcs_ptr2len(char_u *p)
 {
     int                len;
 
-    // Check if second byte is not missing.
+    if (*p == NUL)
+       return 0;
+
+    // if the second byte is missing the length is 1
     len = MB_BYTE2LEN(*p);
     if (len == 2 && p[1] == NUL)
        len = 1;
@@ -2105,6 +2109,7 @@ utf_ptr2len_len(char_u *p, int size)
 /*
  * Return the number of bytes the UTF-8 encoding of the character at "p" takes.
  * This includes following composing characters.
+ * Returns zero for NUL.
  */
     int
 utfc_ptr2len(char_u *p)
index c63082e8e8b6dcc823d2fee3f3054ee363e8f11e..313d791850c003bfbe907b33d89e440567ea3d13 100644 (file)
@@ -75,6 +75,18 @@ func Test_for_invalid()
   redraw
 endfunc
 
+func Test_for_over_null_string()
+  let save_enc = &enc
+  set enc=iso8859
+  let cnt = 0
+  for c in test_null_string()
+    let cnt += 1
+  endfor
+  call assert_equal(0, cnt)
+
+  let &enc = save_enc
+endfunc
+
 func Test_readfile_binary()
   new
   call setline(1, ['one', 'two', 'three'])
index 3aff052a75beb4cfac89ef638c6e70aba1684c82..a6293e0cfa16202d7edaf87f3758bd0a56263373 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    220,
 /**/
     219,
 /**/