diff --git a/lib/rmt.h b/lib/rmt.h index 2ce9dc5..4580e49 100644 --- a/lib/rmt.h +++ b/lib/rmt.h @@ -17,8 +17,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -extern char *rmt_command; -extern char *rmt_dev_name__; +/* upstream fix 0b3d84a0ee */ +extern char const *rmt_command; +extern char const *rmt_dev_name__; int rmt_open__ (const char *, int, int, const char *); int rmt_close__ (int); diff --git a/lib/rtapelib.c b/lib/rtapelib.c index 3aee428..1cef0fc 100644 --- a/lib/rtapelib.c +++ b/lib/rtapelib.c @@ -90,10 +90,10 @@ static int from_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}}; /* The pipes for sending data to remote tape drives. */ static int to_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}}; -char *rmt_command = DEFAULT_RMT_COMMAND; +char const *rmt_command = DEFAULT_RMT_COMMAND; /* upstream fix 0b3d84a0ee */ /* Temporary variable used by macros in rmt.h. */ -char *rmt_dev_name__; +char const *rmt_dev_name__; /* upstream fix 0b3d84a0ee */ /* If true, always consider file names to be local, even if they contain colons */ @@ -490,15 +490,17 @@ rmt_open__ (const char *file_name, int open_mode, int bias, { /* Child. */ - close (STDIN_FILENO); - dup (to_remote[remote_pipe_number][PREAD]); - close (to_remote[remote_pipe_number][PREAD]); - close (to_remote[remote_pipe_number][PWRITE]); - - close (STDOUT_FILENO); - dup (from_remote[remote_pipe_number][PWRITE]); - close (from_remote[remote_pipe_number][PREAD]); - close (from_remote[remote_pipe_number][PWRITE]); + /* upstream fix 0b3d84a0ee */ + if (dup2 (to_remote[remote_pipe_number][PREAD], STDIN_FILENO) < 0 + || (to_remote[remote_pipe_number][PREAD] != STDIN_FILENO + && close (to_remote[remote_pipe_number][PREAD]) != 0) + || (to_remote[remote_pipe_number][PWRITE] != STDIN_FILENO + && close (to_remote[remote_pipe_number][PWRITE]) != 0) + || dup2 (from_remote[remote_pipe_number][PWRITE], STDOUT_FILENO) < 0 + || close (from_remote[remote_pipe_number][PREAD]) != 0 + || close (from_remote[remote_pipe_number][PWRITE]) != 0) + error (EXIT_ON_EXEC_ERROR, errno, + _("Cannot redirect files for remote shell")); sys_reset_uid_gid (); diff --git a/lib/system.h b/lib/system.h index 2deb585..599d4ba 100644 --- a/lib/system.h +++ b/lib/system.h @@ -471,8 +471,13 @@ char *getenv (); # define SET_BINARY_MODE(arc) # define ERRNO_IS_EACCES 0 # define TTY_NAME "/dev/tty" -# define sys_reset_uid_gid() \ - do { setuid (getuid ()); setgid (getgid ()); } while (0) + +/* upstream fix 0b3d84a0ee */ +# define sys_reset_uid_gid() \ + do { \ + if (! (setuid (getuid ()) == 0 && setgid (getgid ()) == 0)) \ + abort (); \ + } while (0) #endif #if XENIX diff --git a/lib/wordsplit.c b/lib/wordsplit.c index bd5d59d..5f555ea 100644 --- a/lib/wordsplit.c +++ b/lib/wordsplit.c @@ -796,6 +796,8 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, value = ""; } /* FIXME: handle defstr */ + (void) defstr; /* upstream commit 17f99bc6f1 */ + if (value) { if (flg & _WSNF_QUOTE) diff --git a/src/compare.c b/src/compare.c index 273269a..796d7aa 100644 --- a/src/compare.c +++ b/src/compare.c @@ -362,7 +362,7 @@ static void diff_dumpdir (void) { const char *dumpdir_buffer; - dev_t dev = 0; + /* upstream fix 5bb04335079 */ struct stat stat_data; if (deref_stat (current_stat_info.file_name, &stat_data) != 0) @@ -372,8 +372,7 @@ diff_dumpdir (void) else stat_error (current_stat_info.file_name); } - else - dev = stat_data.st_dev; + /* upstream fix 5bb04335079 */ dumpdir_buffer = directory_contents (scan_directory (¤t_stat_info)); diff --git a/src/system.c b/src/system.c index a27a7de..2049240 100644 --- a/src/system.c +++ b/src/system.c @@ -25,7 +25,7 @@ #include #include -static void +static void __attribute__ ((__noreturn__)) /* upstream (similar) fix in 17f99bc6f1405 */ xexec (const char *cmd) { struct wordsplit ws; @@ -745,8 +745,7 @@ int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st) { int p[2]; - char *argv[4]; - + xpipe (p); pipe_handler = signal (SIGPIPE, SIG_IGN); global_pid = xfork (); @@ -806,7 +805,6 @@ int sys_exec_info_script (const char **archive_name, int volume_number) { pid_t pid; - char *argv[4]; char uintbuf[UINTMAX_STRSIZE_BOUND]; int p[2]; static RETSIGTYPE (*saved_handler) (int sig); @@ -881,7 +879,7 @@ sys_exec_checkpoint_script (const char *script_name, int checkpoint_number) { pid_t pid; - char *argv[4]; + /* upstream commit 17f99bc6f */ char uintbuf[UINTMAX_STRSIZE_BOUND]; pid = xfork (); @@ -912,10 +910,7 @@ sys_exec_checkpoint_script (const char *script_name, setenv ("TAR_FORMAT", archive_format_string (current_format == DEFAULT_FORMAT ? archive_format : current_format), 1); - argv[0] = "/bin/sh"; - argv[1] = "-c"; - argv[2] = (char *) script_name; - argv[3] = NULL; + /* upstream commit 17f99bc6f */ priv_set_restore_linkdir (); xexec (script_name); diff --git a/src/update.c b/src/update.c index 4739e0d..3b28734 100644 --- a/src/update.c +++ b/src/update.c @@ -145,7 +145,7 @@ update_archive (void) if (S_ISDIR (s.st_mode)) { char *p, *dirp; - DIR *stream; + DIR *stream = NULL; /* upstream commit 5bb043350790 */ int fd = openat (chdir_fd, name->name, open_read_flags | O_DIRECTORY); if (fd < 0) diff --git a/tests/genfile.c b/tests/genfile.c index 8541be6..fa480ef 100644 --- a/tests/genfile.c +++ b/tests/genfile.c @@ -485,9 +485,11 @@ generate_files_from_list () static void mkhole (int fd, off_t displ) { - if (lseek (fd, displ, SEEK_CUR) == -1) + off_t offset = lseek (fd, displ, SEEK_CUR); + if (offset < 0) error (EXIT_FAILURE, errno, "lseek"); - ftruncate (fd, lseek (fd, 0, SEEK_CUR)); + if (ftruncate (fd, offset) != 0) + error (EXIT_FAILURE, errno, "ftruncate"); } static void @@ -685,13 +687,18 @@ exec_checkpoint (struct action *p) error (0, errno, _("cannot open `%s'"), p->name); break; } - ftruncate (fd, p->size); + if (ftruncate (fd, p->size) != 0) + { + error (0, errno, _("cannot truncate `%s'"), p->name); + break; + } close (fd); } break; case OPT_EXEC: - system (p->name); + if (system (p->name) != 0) + error (0, 0, _("command failed: %s"), p->name); break; case OPT_UNLINK: @@ -761,7 +768,8 @@ exec_command (void) signal (SIGCHLD, SIG_DFL); #endif - pipe (fd); + if (pipe (fd) != 0) + error (EXIT_FAILURE, errno, "pipe"); pid = fork (); if (pid == -1)