about summary refs log tree commit diff
path: root/pkgs/development/tools/build-managers/gnumake/3.82/copy-on-expand.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/build-managers/gnumake/3.82/copy-on-expand.patch')
-rw-r--r--pkgs/development/tools/build-managers/gnumake/3.82/copy-on-expand.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/pkgs/development/tools/build-managers/gnumake/3.82/copy-on-expand.patch b/pkgs/development/tools/build-managers/gnumake/3.82/copy-on-expand.patch
new file mode 100644
index 000000000000..3f202b4db96b
--- /dev/null
+++ b/pkgs/development/tools/build-managers/gnumake/3.82/copy-on-expand.patch
@@ -0,0 +1,58 @@
+fix from upstream cvs
+
+----------------------------
+revision 1.58
+date: 2011-08-29 12:20:19 -0400;  author: psmith;  state: Exp;  lines: +7 -13;  commitid: MdH0jSxpuIy7mqxv;
+Save strings we're expanding in case an embedded eval causes them
+to be freed (if they're the value of a variable that's reset for example).
+See Savannah patch #7534
+
+Index: expand.c
+===================================================================
+RCS file: /sources/make/make/expand.c,v
+retrieving revision 1.57
+retrieving revision 1.58
+diff -u -p -r1.57 -r1.58
+--- expand.c	7 May 2011 20:03:49 -0000	1.57
++++ expand.c	29 Aug 2011 16:20:19 -0000	1.58
+@@ -197,7 +197,7 @@ variable_expand_string (char *line, cons
+ {
+   struct variable *v;
+   const char *p, *p1;
+-  char *abuf = NULL;
++  char *save;
+   char *o;
+   unsigned int line_offset;
+ 
+@@ -212,16 +212,11 @@ variable_expand_string (char *line, cons
+       return (variable_buffer);
+     }
+ 
+-  /* If we want a subset of the string, allocate a temporary buffer for it.
+-     Most of the functions we use here don't work with length limits.  */
+-  if (length > 0 && string[length] != '\0')
+-    {
+-      abuf = xmalloc(length+1);
+-      memcpy(abuf, string, length);
+-      abuf[length] = '\0';
+-      string = abuf;
+-    }
+-  p = string;
++  /* We need a copy of STRING: due to eval, it's possible that it will get
++     freed as we process it (it might be the value of a variable that's reset
++     for example).  Also having a nil-terminated string is handy.  */
++  save = length < 0 ? xstrdup (string) : xstrndup (string, length);
++  p = save;
+ 
+   while (1)
+     {
+@@ -411,8 +406,7 @@ variable_expand_string (char *line, cons
+       ++p;
+     }
+ 
+-  if (abuf)
+-    free (abuf);
++  free (save);
+ 
+   variable_buffer_output (o, "", 1);
+   return (variable_buffer + line_offset);