0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.1.2149: crash when running out of memory very early

Problem:    Crash when running out of memory very early.
Solution:   Do not use IObuff when it's NULL. (closes #5052)
This commit is contained in:
Bram Moolenaar
2019-10-14 22:01:57 +02:00
parent 6aa7523b96
commit e3a22cb1ba
2 changed files with 85 additions and 29 deletions

View File

@@ -356,34 +356,61 @@ int vim_snprintf(char *str, size_t str_m, const char *fmt, ...);
int int
smsg(const char *s, ...) smsg(const char *s, ...)
{ {
va_list arglist; if (IObuff == NULL)
{
// Very early in initialisation and already something wrong, just
// give the raw message so the user at least gets a hint.
return msg((char *)s);
}
else
{
va_list arglist;
va_start(arglist, s); va_start(arglist, s);
vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist); vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
va_end(arglist); va_end(arglist);
return msg((char *)IObuff); return msg((char *)IObuff);
}
} }
int int
smsg_attr(int attr, const char *s, ...) smsg_attr(int attr, const char *s, ...)
{ {
va_list arglist; if (IObuff == NULL)
{
// Very early in initialisation and already something wrong, just
// give the raw message so the user at least gets a hint.
return msg_attr((char *)s, attr);
}
else
{
va_list arglist;
va_start(arglist, s); va_start(arglist, s);
vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist); vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
va_end(arglist); va_end(arglist);
return msg_attr((char *)IObuff, attr); return msg_attr((char *)IObuff, attr);
}
} }
int int
smsg_attr_keep(int attr, const char *s, ...) smsg_attr_keep(int attr, const char *s, ...)
{ {
va_list arglist; if (IObuff == NULL)
{
// Very early in initialisation and already something wrong, just
// give the raw message so the user at least gets a hint.
return msg_attr_keep((char *)s, attr, TRUE);
}
else
{
va_list arglist;
va_start(arglist, s); va_start(arglist, s);
vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist); vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
va_end(arglist); va_end(arglist);
return msg_attr_keep((char *)IObuff, attr, TRUE); return msg_attr_keep((char *)IObuff, attr, TRUE);
}
} }
#endif #endif
@@ -723,17 +750,26 @@ emsg(char *s)
int int
semsg(const char *s, ...) semsg(const char *s, ...)
{ {
/* Skip this if not giving error messages at the moment. */ // Skip this if not giving error messages at the moment.
if (!emsg_not_now()) if (!emsg_not_now())
{ {
va_list ap; if (IObuff == NULL)
{
// Very early in initialisation and already something wrong, just
// give the raw message so the user at least gets a hint.
return emsg_core((char_u *)s);
}
else
{
va_list ap;
va_start(ap, s); va_start(ap, s);
vim_vsnprintf((char *)IObuff, IOSIZE, s, ap); vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
va_end(ap); va_end(ap);
return emsg_core(IObuff); return emsg_core(IObuff);
}
} }
return TRUE; /* no error messages at the moment */ return TRUE; // no error messages at the moment
} }
#endif #endif
@@ -764,12 +800,21 @@ siemsg(const char *s, ...)
{ {
if (!emsg_not_now()) if (!emsg_not_now())
{ {
va_list ap; if (IObuff == NULL)
{
// Very early in initialisation and already something wrong, just
// give the raw message so the user at least gets a hint.
emsg_core((char_u *)s);
}
else
{
va_list ap;
va_start(ap, s); va_start(ap, s);
vim_vsnprintf((char *)IObuff, IOSIZE, s, ap); vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
va_end(ap); va_end(ap);
emsg_core(IObuff); emsg_core(IObuff);
}
} }
# ifdef ABORT_ON_INTERNAL_ERROR # ifdef ABORT_ON_INTERNAL_ERROR
abort(); abort();
@@ -3506,8 +3551,17 @@ give_warning(char_u *message, int hl)
void void
give_warning2(char_u *message, char_u *a1, int hl) give_warning2(char_u *message, char_u *a1, int hl)
{ {
vim_snprintf((char *)IObuff, IOSIZE, (char *)message, a1); if (IObuff == NULL)
give_warning(IObuff, hl); {
// Very early in initialisation and already something wrong, just give
// the raw message so the user at least gets a hint.
give_warning((char_u *)message, hl);
}
else
{
vim_snprintf((char *)IObuff, IOSIZE, (char *)message, a1);
give_warning(IObuff, hl);
}
} }
#endif #endif

View File

@@ -753,6 +753,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 */
/**/
2149,
/**/ /**/
2148, 2148,
/**/ /**/