bug-tar
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-tar] [PATCH] maint: remove lint uncovered by tar's new use of manyw


From: Paul Eggert
Subject: [Bug-tar] [PATCH] maint: remove lint uncovered by tar's new use of manywarnings
Date: Tue, 18 Dec 2012 20:42:51 -0800
User-agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0

[This patch is to paxutils; the next two will be for GNU tar.]

* lib/rmt.h, lib/rtapelib.c (rmt_command, rmt_dev_name__):
Now pointer to const.
* lib/rtapelib.c (rmt_open__): Check return codes from dup2, close.
Don't mishandle the case when 'pipe' allocates file descriptor 0.
* lib/system.h (sys_reset_uid_gid): Check return codes from
setuid, setgid.
* tests/genfile.c (mkhole, exec_checkpoint):
Check return code from ftruncate.
(mkhole): Don't call fseek twice.
(exec_checkpoint): Check return code from system.
(exec_command): Check return code from pipe.
---
 lib/rmt.h       |  4 ++--
 lib/rtapelib.c  | 23 ++++++++++++-----------
 lib/system.h    |  7 +++++--
 tests/genfile.c | 18 +++++++++++++-----
 4 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/lib/rmt.h b/lib/rmt.h
index 2ce9dc5..ff10e7c 100644
--- a/lib/rmt.h
+++ b/lib/rmt.h
@@ -17,8 +17,8 @@
    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__;
+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..7213031 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;
/* Temporary variable used by macros in rmt.h. */
-char *rmt_dev_name__;
+char const *rmt_dev_name__;
/* If true, always consider file names to be local, even if they contain
    colons */
@@ -490,15 +490,16 @@ 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]);
+       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..ef46267 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -471,8 +471,11 @@ 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)
+# define sys_reset_uid_gid()                                   \
+  do {                                                         \
+    if (! (setuid (getuid ()) == 0 && setgid (getgid ()) == 0)) \
+      abort ();                                                        \
+  } while (0)
 #endif
#if XENIX
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)
--
1.7.11.7




reply via email to

[Prev in Thread] Current Thread [Next in Thread]