From 61cd3fd26855d40ee3a6491b2aa3611cd2aae46c Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Thu, 14 Apr 2016 11:51:38 +0300 Subject: [PATCH] Fix argument handling when running external commands. * src/system.c (xexec): Use sh -c to run the command. This fixed bug introduced by 7b5e80396 (tar 1.27) * doc/tar.texi: Fix checkpoint examples: (1) $TAR_FILENAME is not available when creating archive and (2) --checkpoint can't be used as abbreviation of --checkpoint-action --- doc/tar.texi | 4 ++-- src/system.c | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/tar.texi b/doc/tar.texi index af4d9d8b..a8969e08 100644 --- a/doc/tar.texi +++ b/doc/tar.texi @@ -4482,7 +4482,7 @@ command, provided that they are properly escaped, for example: @smallexample @kbd{tar -c -f arc.tar \ - --checkpoint-action='exec=/sbin/cpoint $TAR_FILENAME'} + --checkpoint-action='exec=/sbin/cpoint $TAR_CHECKPOINT'} @end smallexample @noindent @@ -4737,7 +4737,7 @@ command line of the external command. For example: @smallexample $ @kbd{tar -x -f archive.tar \ - --checkpoint=exec='printf "%04d in %32s\r" $TAR_CHECKPOINT $TAR_ARCHIVE'} + --checkpoint-action=exec='printf "%04d in %32s\r" $TAR_CHECKPOINT $TAR_ARCHIVE'} @end smallexample @noindent diff --git a/src/system.c b/src/system.c index e7eede7e..71a812d5 100644 --- a/src/system.c +++ b/src/system.c @@ -27,13 +27,14 @@ static _Noreturn void xexec (const char *cmd) { - struct wordsplit ws; + char *argv[4]; - ws.ws_env = (const char **) environ; - if (wordsplit (cmd, &ws, (WRDSF_DEFFLAGS | WRDSF_ENV) & ~WRDSF_NOVAR)) - FATAL_ERROR ((0, 0, _("cannot split string '%s': %s"), - cmd, wordsplit_strerror (&ws))); - execvp (ws.ws_wordv[0], ws.ws_wordv); + argv[0] = (char *) "/bin/sh"; + argv[1] = (char *) "-c"; + argv[2] = (char *) cmd; + argv[3] = NULL; + + execv ("/bin/sh", argv); exec_fatal (cmd); } -- 2.47.2