]> git.wh0rd.org - dump.git/blobdiff - common/dumprmt.c
64bit and glibc 2.2.2 fixes.
[dump.git] / common / dumprmt.c
index db18d328547cb717a37cc586b04b950d68313c62..503b933162538f513e1fd2f2d42f3f1cfee3da70 100644 (file)
@@ -2,7 +2,8 @@
  *     Ported to Linux's Second Extended File System as part of the
  *     dump and restore backup suit
  *     Remy Card <card@Linux.EU.Org>, 1994-1997
- *     Stelian Pop <pop@cybercable.fr>, 1999
+ *     Stelian Pop <pop@noos.fr>, 1999-2000
+ *     Stelian Pop <pop@noos.fr> - AlcĂ´ve <www.alcove.fr>, 2000
  */
 
 /*-
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: dumprmt.c,v 1.7 1999/10/30 22:55:50 tiniou Exp $";
+       "$Id: dumprmt.c,v 1.16 2001/02/22 10:57:39 stelian Exp $";
 #endif /* not lint */
 
+#include <config.h>
 #ifdef __linux__
 #include <sys/types.h>
 #include <linux/types.h>
@@ -97,6 +99,7 @@ static const char rcsid[] =
 static int rmtstate = TS_CLOSED;
 static int tormtape = -1;
 static int fromrmtape = -1;
+int rshpid = -1;
 static const char *rmtpeer = 0;
 
 static int okname __P((const char *));
@@ -168,6 +171,7 @@ rmtgetconn(void)
        int size;
        int throughput;
        int on;
+       char *rmtpeercopy;
 
        rsh = getenv("RSH");
 
@@ -203,19 +207,29 @@ rmtgetconn(void)
                rshcmd[4] = rmt;
                rshcmd[5] = NULL;
 
-               if (piped_child(rshcmd) < 0) {
+               /* Restore the uid and gid. We really don't want
+                * to execute whatever is put into RSH variable with
+                * more priviledges than needed... */
+               setuid(getuid());
+               setgid(getgid());
+
+               if ((rshpid = piped_child(rshcmd)) < 0) {
                        msg("cannot open connection\n");
                        return 0;
                }
        }
        else {
+               /* Copy rmtpeer to rmtpeercopy to ignore the
+                  return value from rcmd. I cannot figure if
+                  this is this a bug in rcmd or in my code... */
+               rmtpeercopy = (char *)rmtpeer;
 #ifdef KERBEROS
                if (dokerberos)
-                       tormtape = krcmd((char **)&rmtpeer, sp->s_port, tuser, rmt, &errfd,
+                       tormtape = krcmd(&rmtpeercopy, sp->s_port, tuser, rmt, &errfd,
                                       (char *)0);
                else
 #endif
-                       tormtape = rcmd((char **)&rmtpeer, (u_short)sp->s_port, pwd->pw_name,
+                       tormtape = rcmd(&rmtpeercopy, (u_short)sp->s_port, pwd->pw_name,
                                      tuser, rmt, &errfd);
                if (tormtape < 0) {
                        msg("login to %s as %s failed.\n", rmtpeer, tuser);
@@ -304,7 +318,7 @@ rmtwrite(const char *buf, size_t count)
 {
        char line[30];
 
-       (void)snprintf(line, sizeof (line), "W%d\n", count);
+       (void)snprintf(line, sizeof (line), "W%ld\n", (long)count);
        write(tormtape, line, strlen(line));
        write(tormtape, buf, count);
        return (rmtreply("write"));
@@ -449,6 +463,7 @@ int piped_child(const char **command) {
                        msg ("cannot dup2 pipe: %s\n", strerror(errno));
                        exit(1);
                }
+               setpgid(0, getpid());
                execvp (command[0], (char *const *) command);
                msg("cannot exec %s: %s\n", command[0], strerror(errno));
                exit(1);