Skip to content

Commit

Permalink
patch 9.0.1144: reading beyond text
Browse files Browse the repository at this point in the history
Problem:    Reading beyond text.
Solution:   Add strlen_maxlen() and use it.
  • Loading branch information
brammool committed Jan 4, 2023
1 parent 7b17eb4 commit c32949b
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/message.c
Expand Up @@ -3055,7 +3055,8 @@ msg_puts_printf(char_u *str, int maxlen)
{
char_u *tofree = NULL;

if (maxlen > 0 && STRLEN(p) > (size_t)maxlen)
if (maxlen > 0 && vim_strlen_maxlen((char *)p, (size_t)maxlen)
>= (size_t)maxlen)
{
tofree = vim_strnsave(p, (size_t)maxlen);
p = tofree;
Expand Down
1 change: 1 addition & 0 deletions src/proto/strings.pro
Expand Up @@ -12,6 +12,7 @@ char_u *strlow_save(char_u *orig);
void del_trailing_spaces(char_u *ptr);
void vim_strncpy(char_u *to, char_u *from, size_t len);
void vim_strcat(char_u *to, char_u *from, size_t tosize);
size_t vim_strlen_maxlen(char *s, size_t maxlen);
int vim_stricmp(char *s1, char *s2);
int vim_strnicmp(char *s1, char *s2, size_t len);
char_u *vim_strchr(char_u *string, int c);
Expand Down
15 changes: 14 additions & 1 deletion src/strings.c
Expand Up @@ -525,6 +525,19 @@ vim_strcat(char_u *to, char_u *from, size_t tosize)
mch_memmove(to + tolen, from, fromlen + 1);
}

/*
* A version of strlen() that has a maximum length.
*/
size_t
vim_strlen_maxlen(char *s, size_t maxlen)
{
size_t i;
for (i = 0; i < maxlen; ++i)
if (s[i] == NUL)
break;
return i;
}

#if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)) || defined(PROTO)
/*
* Compare two strings, ignoring case, using current locale.
Expand Down Expand Up @@ -582,7 +595,7 @@ vim_strnicmp(char *s1, char *s2, size_t len)
* 128 to 255 correctly. It also doesn't return a pointer to the NUL at the
* end of the string.
*/
char_u *
char_u *
vim_strchr(char_u *string, int c)
{
char_u *p;
Expand Down
11 changes: 11 additions & 0 deletions src/testdir/test_cmdline.vim
Expand Up @@ -654,6 +654,17 @@ func Test_getcompletion()
call assert_fails('call getcompletion("abc", [])', 'E1174:')
endfunc

func Test_multibyte_expression()
" This was using uninitialized memory.
let lines =<< trim END
set verbose=6
norm @=ٷ
qall!
END
call writefile(lines, 'XmultiScript', 'D')
call RunVim('', '', '-u NONE -n -e -s -S XmultiScript')
endfunc

" Test for getcompletion() with "fuzzy" in 'wildoptions'
func Test_getcompletion_wildoptions()
let save_wildoptions = &wildoptions
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -695,6 +695,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1144,
/**/
1143,
/**/
Expand Down

0 comments on commit c32949b

Please sign in to comment.