mirror of
https://github.com/mirror/make.git
synced 2025-02-06 01:30:23 +08:00
(construct_command_argv_internal): Handle " quoting too, when no
backslash, $ or ` characters appear inside the quotes.
This commit is contained in:
parent
d525f4dd72
commit
7879457545
35
job.c
35
job.c
@ -1,5 +1,5 @@
|
||||
/* Job execution and handling for GNU Make.
|
||||
Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
|
||||
Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
|
||||
This file is part of GNU Make.
|
||||
|
||||
GNU Make is free software; you can redistribute it and/or modify
|
||||
@ -1250,11 +1250,12 @@ exec_command (argv, envp)
|
||||
_exit (127);
|
||||
}
|
||||
|
||||
/* Figure out the argument list necessary to run LINE as a command.
|
||||
Try to avoid using a shell. This routine handles only ' quoting.
|
||||
Starting quotes may be escaped with a backslash. If any of the
|
||||
characters in sh_chars[] is seen, or any of the builtin commands
|
||||
listed in sh_cmds[] is the first word of a line, the shell is used.
|
||||
/* Figure out the argument list necessary to run LINE as a command. Try to
|
||||
avoid using a shell. This routine handles only ' quoting, and " quoting
|
||||
when no backslash, $ or ` characters are seen in the quotes. Starting
|
||||
quotes may be escaped with a backslash. If any of the characters in
|
||||
sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[]
|
||||
is the first word of a line, the shell is used.
|
||||
|
||||
If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
|
||||
If *RESTP is NULL, newlines will be ignored.
|
||||
@ -1332,7 +1333,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
|
||||
string_char:
|
||||
/* Inside a string, just copy any char except a closing quote
|
||||
or a backslash-newline combination. */
|
||||
if (*p == '\'')
|
||||
if (*p == instring)
|
||||
instring = 0;
|
||||
else if (*p == '\\' && p[1] == '\n')
|
||||
goto swallow_escaped_newline;
|
||||
@ -1342,6 +1343,10 @@ construct_command_argv_internal (line, restp, shell, ifs)
|
||||
*restp = p;
|
||||
goto end_of_line;
|
||||
}
|
||||
/* Backslash, $, and ` are special inside double quotes.
|
||||
If we see any of those, punt. */
|
||||
else if (instring == '"' && index ("\\$`", *p) != 0)
|
||||
goto slow;
|
||||
else
|
||||
*ap++ = *p;
|
||||
}
|
||||
@ -1399,7 +1404,8 @@ construct_command_argv_internal (line, restp, shell, ifs)
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
instring = 1;
|
||||
case '"':
|
||||
instring = *p;
|
||||
break;
|
||||
|
||||
case '\n':
|
||||
@ -1564,7 +1570,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*p == '\\' || *p == '\''
|
||||
if (*p == '\\' || *p == '\'' || *p == '"'
|
||||
|| isspace (*p)
|
||||
|| index (sh_chars, *p) != 0)
|
||||
*ap++ = '\\';
|
||||
@ -1580,11 +1586,12 @@ construct_command_argv_internal (line, restp, shell, ifs)
|
||||
return new_argv;
|
||||
}
|
||||
|
||||
/* Figure out the argument list necessary to run LINE as a command.
|
||||
Try to avoid using a shell. This routine handles only ' quoting.
|
||||
Starting quotes may be escaped with a backslash. If any of the
|
||||
characters in sh_chars[] is seen, or any of the builtin commands
|
||||
listed in sh_cmds[] is the first word of a line, the shell is used.
|
||||
/* Figure out the argument list necessary to run LINE as a command. Try to
|
||||
avoid using a shell. This routine handles only ' quoting, and " quoting
|
||||
when no backslash, $ or ` characters are seen in the quotes. Starting
|
||||
quotes may be escaped with a backslash. If any of the characters in
|
||||
sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[]
|
||||
is the first word of a line, the shell is used.
|
||||
|
||||
If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
|
||||
If *RESTP is NULL, newlines will be ignored.
|
||||
|
Loading…
Reference in New Issue
Block a user