summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2002-10-05 13:45:47 +0000
committerPaul Smith <psmith@gnu.org>2002-10-05 13:45:47 +0000
commit47cd8d4624b60d3462991c436c961e0721cd278b (patch)
tree897bc298ea2cd924c12f029d6b699a2c7adaa84b
parentd1d9c0274bf49bac2cf5293caef54f474cced796 (diff)
downloadgunmake-47cd8d4624b60d3462991c436c961e0721cd278b.tar.gz
Fix core dump on malformed variable line (Debian bug #81656)
Allow SysV-style variable references to use {} in addition to (). Add variable.h to the POTFILES.in since it has a translatable string.
-rw-r--r--ChangeLog9
-rw-r--r--expand.c2
-rw-r--r--po/ChangeLog4
-rw-r--r--po/POTFILES.in1
-rw-r--r--read.c23
-rw-r--r--tests/ChangeLog5
-rw-r--r--tests/scripts/variables/automatic6
7 files changed, 39 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 2ca872b..ee0936b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2002-10-04 Paul D. Smith <psmith@gnu.org>
+
+ * read.c (eval): Allow SysV $$@ variables to use {} braces as well
+ as () braces.
+ (record_files): Ditto.
+
+ * expand.c (variable_expand_string): In $(A:x=y) expansion limit
+ the search for the '=' to only within the enclosing parens.
+
2002-10-03 Paul D. Smith <psmith@gnu.org>
Version 3.80 released.
diff --git a/expand.c b/expand.c
index 6722e1b..3027f47 100644
--- a/expand.c
+++ b/expand.c
@@ -286,7 +286,7 @@ variable_expand_string (line, string, length)
char *subst_beg, *subst_end, *replace_beg, *replace_end;
subst_beg = colon + 1;
- subst_end = strchr (subst_beg, '=');
+ subst_end = lindex (subst_beg, end, '=');
if (subst_end == 0)
/* There is no = in sight. Punt on the substitution
reference and treat this as a variable name containing
diff --git a/po/ChangeLog b/po/ChangeLog
index a362db7..5c5fe1d 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,3 +1,7 @@
+2002-10-05 Paul D. Smith <psmith@gnu.org>
+
+ * POTFILES.in: Add variable.h as it has a translatable string.
+
2002-08-08 Paul D. Smith <psmith@gnu.org>
* LINGUAS: Add a new translation for Chinese (simplified) (zh_CN).
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 3c9e849..30b7864 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -20,5 +20,6 @@ remote-cstms.c
rule.c
signame.c
variable.c
+variable.h
vmsfunctions.c
vpath.c
diff --git a/read.c b/read.c
index 9a4c609..07bb11a 100644
--- a/read.c
+++ b/read.c
@@ -1081,7 +1081,7 @@ eval (ebuf, set_default)
have_sysv_atvar = 0;
if (!posix_pedantic)
for (p = strchr (p2, '$'); p != 0; p = strchr (p+1, '$'))
- if (p[1] == '@' || (p[1] == '(' && p[2] == '@'))
+ if (p[1] == '@' || ((p[1] == '(' || p[1] == '{') && p[2] == '@'))
{
have_sysv_atvar = 1;
break;
@@ -1862,7 +1862,7 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
since we're just emulating a SysV function, and if we do that then
why not emulate it completely (that's what SysV make does: it
re-expands the entire prerequisite list, all the time, with $@
- etc. in scope. But, it would be a pain indeed to document this
+ etc. in scope). But, it would be a pain indeed to document this
("iff you use $$@, your prerequisite lists is expanded twice...")
Ouch. Maybe better to make the code more complex. */
@@ -1895,20 +1895,23 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
char *at;
int atlen;
- /* If it's a '$@' or '$(@', it's escaped */
+ /* If it's '$@', '$(@', or '${@', it's escaped */
if ((++p)[0] == '$'
- && (p[1] == '@' || (p[1] == '(' && p[2] == '@')))
+ && (p[1] == '@'
+ || ((p[1] == '(' || p[1] == '{') && p[2] == '@')))
{
bcopy (p, s, strlen (p)+1);
continue;
}
- /* Maybe found one. Check. p will point to '@' [for $@] or
- ')' [for $(@)] or 'D' [for $(@D)] or 'F' [for $(@F)]. */
- if (p[0] != '@'
- && (p[0] != '(' || (++p)[0] != '@'
- || ((++p)[0] != ')'
- && (p[1] != ')' || (p[0] != 'D' && p[0] != 'F')))))
+ /* Maybe found one. We like anything of any form matching @,
+ [({]@[}):], or [({]@[DF][}):]. */
+
+ if (! (p[0] == '@'
+ || ((p[0] == '(' || p[0] == '{') && (++p)[0] == '@'
+ && (((++p)[0] == ')' || p[0] == '}' || p[0] == ':')
+ || ((p[1] == ')' || p[1] == '}' || p[1] == ':')
+ && (p[0] == 'D' || p[0] == 'F'))))))
continue;
/* Found one. Compute the length and string ptr. Move p
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 6f42eae..2c39999 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2002-10-05 Paul D. Smith <psmith@gnu.org>
+
+ * scripts/variables/automatic: Add tests for $$(@), $${@}, $${@D},
+ and $${@F}.
+
2002-09-23 Paul D. Smith <psmith@gnu.org>
* scripts/features/escape: Test handling of escaped comment
diff --git a/tests/scripts/variables/automatic b/tests/scripts/variables/automatic
index 42e8cba..2919960 100644
--- a/tests/scripts/variables/automatic
+++ b/tests/scripts/variables/automatic
@@ -60,6 +60,8 @@ print MAKEFILE <<'EOF';
$(dir)/foo $(dir)/bar: $@.x $$@.x $$$@.x $$$$@.x $$(@D).x $$(@F).x
$(dir)/x.z $(dir)/y.z: $(dir)/%.z : $@.% $$@.% $$$@.% $$$$@.% $$(@D).% $$(@F).%
+
+$(dir)/biz: $$(@).x $${@}.x $${@D}.x $${@F}.x
EOF
close(MAKEFILE);
@@ -72,4 +74,8 @@ $answer = ".x\n$dir/foo.x\n\$.x\n\$@.x\n$dir.x\nfoo.x\n$dir/bar.x\nbar.x\n";
$answer = ".x\n$dir/x.z.x\n\$.x\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\n\$.y\n\$@.y\n$dir.y\ny.z.y\n";
&compare_output($answer, &get_logfile(1));
+&run_make_with_options($makefile2, "$dir/biz", &get_logfile);
+$answer = "$dir/biz.x\n$dir.x\nbiz.x\n";
+&compare_output($answer, &get_logfile(1));
+
1;