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);