xinstall: fix invocation of llvm-strip

When executing strip(1), '--' is passed as an argument to explicitly
terminate the getopt(3) loop. The option parsing in llvm-strip doesn't
support this however, so setting XSTRIPBIN=llvm-strip results in an
unsupported argument error. llvm-strip(1) is otherwise
commandline-compatible with FreeBSD's strip(1), so just use the
documented argument format that is common to both.

Special care needs to be taken for filenames beginning with a '-'.

Reviewed by:	arichardson, eugen (earlier version, both)
Discussed with:	jilles
Sponsored by:	NetApp, Inc.
Sponsored by:	Klara, Inc.
Differential Revision:	https://reviews.freebsd.org/D30614
This commit is contained in:
Mitchell Horne 2021-06-02 12:00:56 -03:00
parent 213ceba977
commit 4d0dc60f14

View File

@ -1306,7 +1306,7 @@ copy(int from_fd, const char *from_name, int to_fd, const char *to_name,
* strip --
* Use strip(1) to strip the target file.
* Just invoke strip(1) on to_name if from_name is NULL, else try
* to run "strip -o to_name -- from_name" and return 0 on failure.
* to run "strip -o to_name from_name" and return 0 on failure.
* Return 1 on success and assign result of digest_file(to_name)
* to *dresp.
*/
@ -1314,10 +1314,12 @@ static int
strip(const char *to_name, int to_fd, const char *from_name, char **dresp)
{
const char *stripbin;
const char *args[6];
const char *args[5];
char *prefixed_from_name;
pid_t pid;
int error, serrno, status;
prefixed_from_name = NULL;
stripbin = getenv("STRIPBIN");
if (stripbin == NULL)
stripbin = "strip";
@ -1328,9 +1330,16 @@ strip(const char *to_name, int to_fd, const char *from_name, char **dresp)
} else {
args[1] = "-o";
args[2] = to_name;
args[3] = "--";
args[4] = from_name;
args[5] = NULL;
/* Prepend './' if from_name begins with '-' */
if (from_name[0] == '-') {
if (asprintf(&prefixed_from_name, "./%s", from_name) == -1)
return (0);
args[3] = prefixed_from_name;
} else {
args[3] = from_name;
}
args[4] = NULL;
}
error = posix_spawnp(&pid, stripbin, NULL, NULL,
__DECONST(char **, args), environ);
@ -1339,6 +1348,7 @@ strip(const char *to_name, int to_fd, const char *from_name, char **dresp)
errc(error == EAGAIN || error == EPROCLIM || error == ENOMEM ?
EX_TEMPFAIL : EX_OSERR, error, "spawn %s", stripbin);
}
free(prefixed_from_name);
if (waitpid(pid, &status, 0) == -1) {
error = errno;
(void)unlink(to_name);