|
@@ -454,11 +454,12 @@ static void handle_internal_command(int argc, const char **argv)
|
|
|
|
|
|
static void execv_dashed_external(const char **argv)
|
|
|
{
|
|
|
- struct strbuf cmd = STRBUF_INIT;
|
|
|
+ char *cmd;
|
|
|
const char *tmp;
|
|
|
int status;
|
|
|
|
|
|
- strbuf_addf(&cmd, "perf-%s", argv[0]);
|
|
|
+ if (asprintf(&cmd, "perf-%s", argv[0]) < 0)
|
|
|
+ goto do_die;
|
|
|
|
|
|
/*
|
|
|
* argv[0] must be the perf command, but the argv array
|
|
@@ -467,7 +468,7 @@ static void execv_dashed_external(const char **argv)
|
|
|
* restore it on error.
|
|
|
*/
|
|
|
tmp = argv[0];
|
|
|
- argv[0] = cmd.buf;
|
|
|
+ argv[0] = cmd;
|
|
|
|
|
|
/*
|
|
|
* if we fail because the command is not found, it is
|
|
@@ -475,15 +476,16 @@ static void execv_dashed_external(const char **argv)
|
|
|
*/
|
|
|
status = run_command_v_opt(argv, 0);
|
|
|
if (status != -ERR_RUN_COMMAND_EXEC) {
|
|
|
- if (IS_RUN_COMMAND_ERR(status))
|
|
|
+ if (IS_RUN_COMMAND_ERR(status)) {
|
|
|
+do_die:
|
|
|
die("unable to run '%s'", argv[0]);
|
|
|
+ }
|
|
|
exit(-status);
|
|
|
}
|
|
|
errno = ENOENT; /* as if we called execvp */
|
|
|
|
|
|
argv[0] = tmp;
|
|
|
-
|
|
|
- strbuf_release(&cmd);
|
|
|
+ zfree(&cmd);
|
|
|
}
|
|
|
|
|
|
static int run_argv(int *argcp, const char ***argv)
|