mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 9.0.1144: reading beyond text
Problem: Reading beyond text. Solution: Add strlen_maxlen() and use it.
This commit is contained in:
@@ -3055,7 +3055,8 @@ msg_puts_printf(char_u *str, int maxlen)
|
|||||||
{
|
{
|
||||||
char_u *tofree = NULL;
|
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);
|
tofree = vim_strnsave(p, (size_t)maxlen);
|
||||||
p = tofree;
|
p = tofree;
|
||||||
|
@@ -12,6 +12,7 @@ char_u *strlow_save(char_u *orig);
|
|||||||
void del_trailing_spaces(char_u *ptr);
|
void del_trailing_spaces(char_u *ptr);
|
||||||
void vim_strncpy(char_u *to, char_u *from, size_t len);
|
void vim_strncpy(char_u *to, char_u *from, size_t len);
|
||||||
void vim_strcat(char_u *to, char_u *from, size_t tosize);
|
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_stricmp(char *s1, char *s2);
|
||||||
int vim_strnicmp(char *s1, char *s2, size_t len);
|
int vim_strnicmp(char *s1, char *s2, size_t len);
|
||||||
char_u *vim_strchr(char_u *string, int c);
|
char_u *vim_strchr(char_u *string, int c);
|
||||||
|
@@ -525,6 +525,19 @@ vim_strcat(char_u *to, char_u *from, size_t tosize)
|
|||||||
mch_memmove(to + tolen, from, fromlen + 1);
|
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)
|
#if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Compare two strings, ignoring case, using current locale.
|
* Compare two strings, ignoring case, using current locale.
|
||||||
|
@@ -654,6 +654,17 @@ func Test_getcompletion()
|
|||||||
call assert_fails('call getcompletion("abc", [])', 'E1174:')
|
call assert_fails('call getcompletion("abc", [])', 'E1174:')
|
||||||
endfunc
|
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'
|
" Test for getcompletion() with "fuzzy" in 'wildoptions'
|
||||||
func Test_getcompletion_wildoptions()
|
func Test_getcompletion_wildoptions()
|
||||||
let save_wildoptions = &wildoptions
|
let save_wildoptions = &wildoptions
|
||||||
|
@@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1144,
|
||||||
/**/
|
/**/
|
||||||
1143,
|
1143,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user