]> granicus.if.org Git - vim/commitdiff
patch 8.1.2149: crash when running out of memory very early v8.1.2149
authorBram Moolenaar <Bram@vim.org>
Mon, 14 Oct 2019 20:01:57 +0000 (22:01 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 14 Oct 2019 20:01:57 +0000 (22:01 +0200)
Problem:    Crash when running out of memory very early.
Solution:   Do not use IObuff when it's NULL. (closes #5052)

src/message.c
src/version.c

index 19defaa1f80a6a27471d73faabab9a0595bf5336..fddb28e2b81517aba744573d429331eaccaa7cc3 100644 (file)
@@ -356,34 +356,61 @@ int vim_snprintf(char *str, size_t str_m, const char *fmt, ...);
     int
 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);
-    vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
-    va_end(arglist);
-    return msg((char *)IObuff);
+       va_start(arglist, s);
+       vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
+       va_end(arglist);
+       return msg((char *)IObuff);
+    }
 }
 
     int
 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);
-    vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
-    va_end(arglist);
-    return msg_attr((char *)IObuff, attr);
+       va_start(arglist, s);
+       vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
+       va_end(arglist);
+       return msg_attr((char *)IObuff, attr);
+    }
 }
 
     int
 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);
-    vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
-    va_end(arglist);
-    return msg_attr_keep((char *)IObuff, attr, TRUE);
+       va_start(arglist, s);
+       vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist);
+       va_end(arglist);
+       return msg_attr_keep((char *)IObuff, attr, TRUE);
+    }
 }
 
 #endif
@@ -723,17 +750,26 @@ emsg(char *s)
     int
 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())
     {
-       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);
-       vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
-       va_end(ap);
-       return emsg_core(IObuff);
+           va_start(ap, s);
+           vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
+           va_end(ap);
+           return emsg_core(IObuff);
+       }
     }
-    return TRUE;               /* no error messages at the moment */
+    return TRUE;               // no error messages at the moment
 }
 #endif
 
@@ -764,12 +800,21 @@ siemsg(const char *s, ...)
 {
     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);
-       vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
-       va_end(ap);
-       emsg_core(IObuff);
+           va_start(ap, s);
+           vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
+           va_end(ap);
+           emsg_core(IObuff);
+       }
     }
 # ifdef ABORT_ON_INTERNAL_ERROR
     abort();
@@ -3506,8 +3551,17 @@ give_warning(char_u *message, int hl)
     void
 give_warning2(char_u *message, char_u *a1, int hl)
 {
-    vim_snprintf((char *)IObuff, IOSIZE, (char *)message, a1);
-    give_warning(IObuff, hl);
+    if (IObuff == NULL)
+    {
+       // 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
 
index cf6c773719b24dc5a4b1b0e2d1cb2ffeca126717..3fc889e91d7dca574a6786d8f8c0c5a20f236bb4 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2149,
 /**/
     2148,
 /**/