From 47cd8d4624b60d3462991c436c961e0721cd278b Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Sat, 5 Oct 2002 13:45:47 +0000 Subject: 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. --- ChangeLog | 9 +++++++++ expand.c | 2 +- po/ChangeLog | 4 ++++ po/POTFILES.in | 1 + read.c | 23 +++++++++++++---------- tests/ChangeLog | 5 +++++ tests/scripts/variables/automatic | 6 ++++++ 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 + + * 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 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 + + * POTFILES.in: Add variable.h as it has a translatable string. + 2002-08-08 Paul D. Smith * 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 + + * scripts/variables/automatic: Add tests for $$(@), $${@}, $${@D}, + and $${@F}. + 2002-09-23 Paul D. Smith * 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; -- cgit v1.2.3