* main.c (decode_env_switches): Ensure we have enough space.
authorPaul Smith <psmith@gnu.org>
Thu, 28 Nov 2013 00:06:45 +0000 (19:06 -0500)
committerPaul Smith <psmith@gnu.org>
Thu, 28 Nov 2013 00:06:45 +0000 (19:06 -0500)
Reported (with patch) by Gerte Hoogewerf <g.hoogewerf@gmail.com>

main.c

diff --git a/main.c b/main.c
index 541fd1f6da7aa0b3707365ce8c056d94c1ff8338..fa0498f6643876368d08494b5a0b67f7015f1013 100644 (file)
--- a/main.c
+++ b/main.c
@@ -2925,16 +2925,14 @@ decode_env_switches (char *envar, unsigned int len)
   /* Allocate a vector that is definitely big enough.  */
   argv = alloca ((1 + len + 1) * sizeof (char *));
 
-  /* We need a buffer to copy the value into while we split it into words
-     and unquote it.  */
-  buf = alloca (2 * len);
-
   /* getopt will look at the arguments starting at ARGV[1].
      Prepend a spacer word.  */
   argv[0] = 0;
   argc = 1;
 
-  /* Set up in case we need to prepend a dash later.  */
+  /* We need a buffer to copy the value into while we split it into words
+     and unquote it.  Set up in case we need to prepend a dash later.  */
+  buf = alloca (1 + len + 1);
   buf[0] = '-';
   p = buf+1;
   argv[argc] = p;
@@ -2956,6 +2954,7 @@ decode_env_switches (char *envar, unsigned int len)
     }
   *p = '\0';
   argv[++argc] = 0;
+  assert (p < buf + len + 2);
 
   if (argv[1][0] != '-' && strchr (argv[1], '=') == 0)
     /* The first word doesn't start with a dash and isn't a variable