Fix random segfaults in pack-objects.
[gitweb.git] / rsh.c
diff --git a/rsh.c b/rsh.c
index d66526941fbe45f99e51babc2c55a63b4baa027c..5754a230e2c23ce3fea255fccd8726af76c13317 100644 (file)
--- a/rsh.c
+++ b/rsh.c
@@ -1,43 +1,10 @@
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
+#include "cache.h"
 #include "rsh.h"
 #include "quote.h"
-#include "cache.h"
 
 #define COMMAND_SIZE 4096
 
-/*
- * Append a string to a string buffer, with or without shell quoting.
- * Return true if the buffer overflowed.
- */
-static int add_to_string(char **ptrp, int *sizep, const char *str, int quote)
-{
-       char *p = *ptrp;
-       int size = *sizep;
-       int oc;
-       int err = 0;
-
-       if ( quote ) {
-               oc = sq_quote_buf(p, size, str);
-       } else {
-               oc = strlen(str);
-               memcpy(p, str, (oc >= size) ? size-1 : oc);
-       }
-
-       if ( oc >= size ) {
-               err = 1;
-               oc = size-1;
-       }
-
-       *ptrp  += oc;
-       **ptrp  = '\0';
-       *sizep -= oc;
-       return err;
-}
-
-int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, 
+int setup_connection(int *fd_in, int *fd_out, const char *remote_prog,
                     char *url, int rmt_argc, char **rmt_argv)
 {
        char *host;
@@ -48,6 +15,7 @@ int setup_connection(int *fd_in, int *fd_out, const char *remote_prog,
        int sizen;
        int of;
        int i;
+       pid_t pid;
 
        if (!strcmp(url, "-")) {
                *fd_in = 0;
@@ -91,7 +59,10 @@ int setup_connection(int *fd_in, int *fd_out, const char *remote_prog,
        if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv))
                return error("Couldn't create socket");
 
-       if (!fork()) {
+       pid = fork();
+       if (pid < 0)
+               return error("Couldn't fork");
+       if (!pid) {
                const char *ssh, *ssh_basename;
                ssh = getenv("GIT_SSH");
                if (!ssh) ssh = "ssh";