2257aac
From 2f661dc20617ba6fdeb2d7e243dc898653faafea Mon Sep 17 00:00:00 2001
2257aac
From: Lubomir Rintel <lkundrak@v3.sk>
2257aac
Date: Tue, 26 Apr 2011 21:50:26 +0200
2257aac
Subject: [PATCH] Always copy the string before expanding it
2257aac
2257aac
It might get freed during expansion, e.g. with eval function.
2257aac
A simple reproducer:
2257aac
2257aac
TRUE = $(eval TRUE := true)
2257aac
all:
2257aac
	$(TRUE)
2257aac
---
2257aac
 ChangeLog |    5 +++++
2257aac
 expand.c  |   18 +++++++++---------
2257aac
 2 files changed, 14 insertions(+), 9 deletions(-)
2257aac
2257aac
diff --git a/ChangeLog b/ChangeLog
2257aac
index 91878fb..7519164 100644
2257aac
--- a/ChangeLog
2257aac
+++ b/ChangeLog
2257aac
@@ -1,3 +1,8 @@
2257aac
+2011-04-26  Lubomir Rintel  <lkundrak@v3.sk>
2257aac
+
2257aac
+	* expand.c (variable_expand_string): Always copy the string
2257aac
+	to expand.
2257aac
+
2257aac
 2010-08-13  Paul Smith  <psmith@gnu.org>
2257aac
 
2257aac
 	* NEWS: Accidentally forgot to back out the sorted wildcard
2257aac
diff --git a/expand.c b/expand.c
2257aac
index 2315b06..3e6e346 100644
2257aac
--- a/expand.c
2257aac
+++ b/expand.c
2257aac
@@ -197,7 +197,7 @@ variable_expand_string (char *line, const char *string, long length)
2257aac
 {
2257aac
   struct variable *v;
2257aac
   const char *p, *p1;
2257aac
-  char *abuf = NULL;
2257aac
+  char *abuf;
2257aac
   char *o;
2257aac
   unsigned int line_offset;
2257aac
 
2257aac
@@ -214,14 +214,15 @@ variable_expand_string (char *line, const char *string, long length)
2257aac
 
2257aac
   /* If we want a subset of the string, allocate a temporary buffer for it.
2257aac
      Most of the functions we use here don't work with length limits.  */
2257aac
-  if (length > 0 && string[length] != '\0')
2257aac
+  if (length == -1)
2257aac
     {
2257aac
-      abuf = xmalloc(length+1);
2257aac
-      memcpy(abuf, string, length);
2257aac
-      abuf[length] = '\0';
2257aac
-      string = abuf;
2257aac
+      length = strlen (string);
2257aac
     }
2257aac
-  p = string;
2257aac
+
2257aac
+  abuf = xmalloc(length+1);
2257aac
+  memcpy(abuf, string, length);
2257aac
+  abuf[length] = '\0';
2257aac
+  p = abuf;
2257aac
 
2257aac
   while (1)
2257aac
     {
2257aac
@@ -411,8 +412,7 @@ variable_expand_string (char *line, const char *string, long length)
2257aac
       ++p;
2257aac
     }
2257aac
 
2257aac
-  if (abuf)
2257aac
-    free (abuf);
2257aac
+  free (abuf);
2257aac
 
2257aac
   variable_buffer_output (o, "", 1);
2257aac
   return (variable_buffer + line_offset);
2257aac
-- 
2257aac
1.7.4.1
2257aac