]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Add an explicit PROXY_FUZZ that just feeds a file into the backend.
authorBen Harris <bjh21@bjh21.me.uk>
Sat, 17 Oct 2015 13:06:06 +0000 (14:06 +0100)
committerBen Harris <bjh21@bjh21.me.uk>
Wed, 28 Oct 2015 22:08:58 +0000 (22:08 +0000)
This saves the need to fork and exec "cat", which should speed things
up.  It also ensures that the network output goes to /dev/null, which
should avoid problems with blocking when writing to a full pipe.

putty.h
unix/uxplink.c
unix/uxproxy.c

diff --git a/putty.h b/putty.h
index c854d9449ebd194e93054564dd26c50c2944afc5..3ccd96cb868beb52d8286d617b3ae1a7ddef1ab8 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -291,7 +291,7 @@ enum {
      * Proxy types.
      */
     PROXY_NONE, PROXY_SOCKS4, PROXY_SOCKS5,
-    PROXY_HTTP, PROXY_TELNET, PROXY_CMD
+    PROXY_HTTP, PROXY_TELNET, PROXY_CMD, PROXY_FUZZ
 };
 
 enum {
index 6d402c947385ab184e7d339526ead586e0bc9392..b8c554894002033dcb0e5583fd0285b9223bf11c 100644 (file)
@@ -691,9 +691,9 @@ int main(int argc, char **argv)
            } else if (!strcmp(p, "-shareexists")) {
                 just_test_share_exists = TRUE;
            } else if (!strcmp(p, "-fuzznet")) {
-               conf_set_int(conf, CONF_proxy_type, PROXY_CMD);
+               conf_set_int(conf, CONF_proxy_type, PROXY_FUZZ);
                conf_set_str(conf, CONF_proxy_telnet_command,
-                            "cat %host");
+                            "%host");
            } else {
                fprintf(stderr, "plink: unknown option \"%s\"\n", p);
                errors = 1;
index 0399245d0c28bd8e7269390d991d835c66176bf5..8c916dc99d7111eb8b898b4b14827555c048c0f5 100644 (file)
@@ -250,13 +250,12 @@ Socket platform_new_connection(SockAddr addr, const char *hostname,
     };
 
     Local_Proxy_Socket ret;
-    int to_cmd_pipe[2], from_cmd_pipe[2], pid;
+    int to_cmd_pipe[2], from_cmd_pipe[2], pid, proxytype;
 
-    if (conf_get_int(conf, CONF_proxy_type) != PROXY_CMD)
+    proxytype = conf_get_int(conf, CONF_proxy_type);
+    if (proxytype != PROXY_CMD && proxytype != PROXY_FUZZ)
        return NULL;
 
-    cmd = format_telnet_command(addr, port, conf);
-
     ret = snew(struct Socket_localproxy_tag);
     ret->fn = &socket_fn_table;
     ret->plug = plug;
@@ -266,45 +265,64 @@ Socket platform_new_connection(SockAddr addr, const char *hostname,
     bufchain_init(&ret->pending_input_data);
     bufchain_init(&ret->pending_output_data);
 
-    /*
-     * Create the pipes to the proxy command, and spawn the proxy
-     * command process.
-     */
-    if (pipe(to_cmd_pipe) < 0 ||
-       pipe(from_cmd_pipe) < 0) {
-       ret->error = dupprintf("pipe: %s", strerror(errno));
-        sfree(cmd);
-       return (Socket)ret;
-    }
-    cloexec(to_cmd_pipe[1]);
-    cloexec(from_cmd_pipe[0]);
-
-    pid = fork();
-
-    if (pid < 0) {
-       ret->error = dupprintf("fork: %s", strerror(errno));
-        sfree(cmd);
-       return (Socket)ret;
-    } else if (pid == 0) {
-       close(0);
-       close(1);
-       dup2(to_cmd_pipe[0], 0);
-       dup2(from_cmd_pipe[1], 1);
-       close(to_cmd_pipe[0]);
-       close(from_cmd_pipe[1]);
-       noncloexec(0);
-       noncloexec(1);
-       execl("/bin/sh", "sh", "-c", cmd, (void *)NULL);
-       _exit(255);
-    }
+    if (proxytype == PROXY_CMD) {
+       cmd = format_telnet_command(addr, port, conf);
+
+       /*
+        * Create the pipes to the proxy command, and spawn the proxy
+        * command process.
+        */
+       if (pipe(to_cmd_pipe) < 0 ||
+           pipe(from_cmd_pipe) < 0) {
+           ret->error = dupprintf("pipe: %s", strerror(errno));
+           sfree(cmd);
+           return (Socket)ret;
+       }
+       cloexec(to_cmd_pipe[1]);
+       cloexec(from_cmd_pipe[0]);
+
+       pid = fork();
+
+       if (pid < 0) {
+           ret->error = dupprintf("fork: %s", strerror(errno));
+           sfree(cmd);
+           return (Socket)ret;
+       } else if (pid == 0) {
+           close(0);
+           close(1);
+           dup2(to_cmd_pipe[0], 0);
+           dup2(from_cmd_pipe[1], 1);
+           close(to_cmd_pipe[0]);
+           close(from_cmd_pipe[1]);
+           noncloexec(0);
+           noncloexec(1);
+           execl("/bin/sh", "sh", "-c", cmd, (void *)NULL);
+           _exit(255);
+       }
 
-    sfree(cmd);
+       sfree(cmd);
 
-    close(to_cmd_pipe[0]);
-    close(from_cmd_pipe[1]);
+       close(to_cmd_pipe[0]);
+       close(from_cmd_pipe[1]);
 
-    ret->to_cmd = to_cmd_pipe[1];
-    ret->from_cmd = from_cmd_pipe[0];
+       ret->to_cmd = to_cmd_pipe[1];
+       ret->from_cmd = from_cmd_pipe[0];
+    } else {
+       cmd = format_telnet_command(addr, port, conf);
+       ret->to_cmd = open("/dev/null", O_WRONLY);
+       if (ret->to_cmd == -1) {
+           ret->error = dupprintf("/dev/null: %s", strerror(errno));
+           sfree(cmd);
+           return (Socket)ret;
+       }
+       ret->from_cmd = open(cmd, O_RDONLY);
+       if (ret->from_cmd == -1) {
+           ret->error = dupprintf("%s: %s", cmd, strerror(errno));
+           sfree(cmd);
+           return (Socket)ret;
+       }
+       sfree(cmd);
+    }
 
     if (!localproxy_by_fromfd)
        localproxy_by_fromfd = newtree234(localproxy_fromfd_cmp);