summaryrefslogtreecommitdiff
path: root/sys-devel/make/files/make-3.82-copy-on-expand.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-devel/make/files/make-3.82-copy-on-expand.patch')
-rw-r--r--sys-devel/make/files/make-3.82-copy-on-expand.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/sys-devel/make/files/make-3.82-copy-on-expand.patch b/sys-devel/make/files/make-3.82-copy-on-expand.patch
new file mode 100644
index 00000000000..3f202b4db96
--- /dev/null
+++ b/sys-devel/make/files/make-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);