mirror of
https://github.com/mirror/make.git
synced 2025-01-27 21:00:22 +08:00
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.
This commit is contained in:
parent
d1d9c0274b
commit
47cd8d4624
@ -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>
|
2002-10-03 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
Version 3.80 released.
|
Version 3.80 released.
|
||||||
|
2
expand.c
2
expand.c
@ -286,7 +286,7 @@ variable_expand_string (line, string, length)
|
|||||||
char *subst_beg, *subst_end, *replace_beg, *replace_end;
|
char *subst_beg, *subst_end, *replace_beg, *replace_end;
|
||||||
|
|
||||||
subst_beg = colon + 1;
|
subst_beg = colon + 1;
|
||||||
subst_end = strchr (subst_beg, '=');
|
subst_end = lindex (subst_beg, end, '=');
|
||||||
if (subst_end == 0)
|
if (subst_end == 0)
|
||||||
/* There is no = in sight. Punt on the substitution
|
/* There is no = in sight. Punt on the substitution
|
||||||
reference and treat this as a variable name containing
|
reference and treat this as a variable name containing
|
||||||
|
@ -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>
|
2002-08-08 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
* LINGUAS: Add a new translation for Chinese (simplified) (zh_CN).
|
* LINGUAS: Add a new translation for Chinese (simplified) (zh_CN).
|
||||||
|
@ -20,5 +20,6 @@ remote-cstms.c
|
|||||||
rule.c
|
rule.c
|
||||||
signame.c
|
signame.c
|
||||||
variable.c
|
variable.c
|
||||||
|
variable.h
|
||||||
vmsfunctions.c
|
vmsfunctions.c
|
||||||
vpath.c
|
vpath.c
|
||||||
|
23
read.c
23
read.c
@ -1081,7 +1081,7 @@ eval (ebuf, set_default)
|
|||||||
have_sysv_atvar = 0;
|
have_sysv_atvar = 0;
|
||||||
if (!posix_pedantic)
|
if (!posix_pedantic)
|
||||||
for (p = strchr (p2, '$'); p != 0; p = strchr (p+1, '$'))
|
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;
|
have_sysv_atvar = 1;
|
||||||
break;
|
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
|
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
|
why not emulate it completely (that's what SysV make does: it
|
||||||
re-expands the entire prerequisite list, all the time, with $@
|
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...")
|
("iff you use $$@, your prerequisite lists is expanded twice...")
|
||||||
Ouch. Maybe better to make the code more complex. */
|
Ouch. Maybe better to make the code more complex. */
|
||||||
|
|
||||||
@ -1895,20 +1895,23 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
|
|||||||
char *at;
|
char *at;
|
||||||
int atlen;
|
int atlen;
|
||||||
|
|
||||||
/* If it's a '$@' or '$(@', it's escaped */
|
/* If it's '$@', '$(@', or '${@', it's escaped */
|
||||||
if ((++p)[0] == '$'
|
if ((++p)[0] == '$'
|
||||||
&& (p[1] == '@' || (p[1] == '(' && p[2] == '@')))
|
&& (p[1] == '@'
|
||||||
|
|| ((p[1] == '(' || p[1] == '{') && p[2] == '@')))
|
||||||
{
|
{
|
||||||
bcopy (p, s, strlen (p)+1);
|
bcopy (p, s, strlen (p)+1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Maybe found one. Check. p will point to '@' [for $@] or
|
/* Maybe found one. We like anything of any form matching @,
|
||||||
')' [for $(@)] or 'D' [for $(@D)] or 'F' [for $(@F)]. */
|
[({]@[}):], or [({]@[DF][}):]. */
|
||||||
if (p[0] != '@'
|
|
||||||
&& (p[0] != '(' || (++p)[0] != '@'
|
if (! (p[0] == '@'
|
||||||
|| ((++p)[0] != ')'
|
|| ((p[0] == '(' || p[0] == '{') && (++p)[0] == '@'
|
||||||
&& (p[1] != ')' || (p[0] != 'D' && p[0] != 'F')))))
|
&& (((++p)[0] == ')' || p[0] == '}' || p[0] == ':')
|
||||||
|
|| ((p[1] == ')' || p[1] == '}' || p[1] == ':')
|
||||||
|
&& (p[0] == 'D' || p[0] == 'F'))))))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Found one. Compute the length and string ptr. Move p
|
/* Found one. Compute the length and string ptr. Move p
|
||||||
|
@ -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>
|
2002-09-23 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
* scripts/features/escape: Test handling of escaped comment
|
* scripts/features/escape: Test handling of escaped comment
|
||||||
|
@ -60,6 +60,8 @@ print MAKEFILE <<'EOF';
|
|||||||
$(dir)/foo $(dir)/bar: $@.x $$@.x $$$@.x $$$$@.x $$(@D).x $$(@F).x
|
$(dir)/foo $(dir)/bar: $@.x $$@.x $$$@.x $$$$@.x $$(@D).x $$(@F).x
|
||||||
|
|
||||||
$(dir)/x.z $(dir)/y.z: $(dir)/%.z : $@.% $$@.% $$$@.% $$$$@.% $$(@D).% $$(@F).%
|
$(dir)/x.z $(dir)/y.z: $(dir)/%.z : $@.% $$@.% $$$@.% $$$$@.% $$(@D).% $$(@F).%
|
||||||
|
|
||||||
|
$(dir)/biz: $$(@).x $${@}.x $${@D}.x $${@F}.x
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
close(MAKEFILE);
|
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";
|
$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));
|
&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;
|
1;
|
||||||
|
Loading…
Reference in New Issue
Block a user