Control of 'addr' is now handed over to {platform_,}new_connection() and
[u/mdw/putty] / portfwd.c
index 03cbd67..e61c05b 100644 (file)
--- a/portfwd.c
+++ b/portfwd.c
@@ -74,7 +74,7 @@ struct PFwdPrivate {
      * we can also use them as a buffer and pointer for reading
      * data from the SOCKS client.
      */
-    char hostname[256];
+    char hostname[256+8];
     int port;
     /*
      * When doing dynamic port forwarding, we can receive
@@ -86,7 +86,7 @@ struct PFwdPrivate {
     int buflen;
 };
 
-static int pfd_closing(Plug plug, char *error_msg, int error_code,
+static int pfd_closing(Plug plug, const char *error_msg, int error_code,
                       int calling_back)
 {
     struct PFwdPrivate *pr = (struct PFwdPrivate *) plug;
@@ -159,15 +159,15 @@ static int pfd_receive(Plug plug, int urgent, char *data, int len)
                    int len;
                    if (pr->dynamic == 0x4000) {
                        pr->dynamic = 0x4001;
+                       pr->port = 8;      /* reset buffer to overwrite name */
                        continue;
                    }
                    pr->hostname[0] = 0;   /* reply version code */
                    pr->hostname[1] = 90;   /* request granted */
                    sk_write(pr->s, pr->hostname, 8);
+                   len= pr->port;
                    pr->port = GET_16BIT_MSB_FIRST(pr->hostname+2);
-                   len = strlen(pr->hostname+8);
-                   memmove(pr->hostname, pr->hostname + 8 + len + 1,
-                           lenof(pr->hostname) - (8 + len + 1));
+                   memmove(pr->hostname, pr->hostname + 8, len);
                    goto connect;
                } else {
                    /*
@@ -220,7 +220,7 @@ static int pfd_receive(Plug plug, int urgent, char *data, int len)
                }
 
                if (pr->dynamic == 0x5001) {
-                   int atype, alen;
+                   int atype, alen = 0;
                    if (pr->port < 6) continue;
                    atype = (unsigned char)pr->hostname[3];
                    if (atype == 1)    /* IPv4 address */
@@ -331,8 +331,8 @@ static void pfd_sent(Plug plug, int bufsize)
 /*
  * Called when receiving a PORT OPEN from the server
  */
-char *pfd_newconnect(Socket *s, char *hostname, int port, void *c,
-                    const Config *cfg)
+const char *pfd_newconnect(Socket *s, char *hostname, int port,
+                          void *c, const Config *cfg)
 {
     static const struct plug_function_table fn_table = {
        pfd_closing,
@@ -342,15 +342,18 @@ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c,
     };
 
     SockAddr addr;
-    char *err, *dummy_realhost;
+    const char *err;
+    char *dummy_realhost;
     struct PFwdPrivate *pr;
 
     /*
      * Try to find host.
      */
     addr = name_lookup(hostname, port, &dummy_realhost, cfg);
-    if ((err = sk_addr_error(addr)) != NULL)
+    if ((err = sk_addr_error(addr)) != NULL) {
+       sk_addr_free(addr);
        return err;
+    }
 
     /*
      * Open socket.
@@ -362,6 +365,7 @@ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c,
     pr->ready = 1;
     pr->c = c;
     pr->backhandle = NULL;            /* we shouldn't need this */
+    pr->dynamic = 0;
 
     pr->s = *s = new_connection(addr, dummy_realhost, port,
                                0, 1, 0, (Plug) pr, cfg);
@@ -371,7 +375,6 @@ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c,
     }
 
     sk_set_private_ptr(*s, pr);
-    sk_addr_free(addr);
     return NULL;
 }
 
@@ -379,7 +382,7 @@ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c,
  called when someone connects to the local port
  */
 
-static int pfd_accepting(Plug p, void *sock)
+static int pfd_accepting(Plug p, OSSocket sock)
 {
     static const struct plug_function_table fn_table = {
        pfd_closing,
@@ -389,7 +392,7 @@ static int pfd_accepting(Plug p, void *sock)
     };
     struct PFwdPrivate *pr, *org;
     Socket s;
-    char *err;
+    const char *err;
 
     org = (struct PFwdPrivate *)p;
     pr = snew(struct PFwdPrivate);
@@ -415,6 +418,7 @@ static int pfd_accepting(Plug p, void *sock)
        pr->port = 0;                  /* hostname buffer is so far empty */
        sk_set_frozen(s, 0);           /* we want to receive SOCKS _now_! */
     } else {
+       pr->dynamic = 0;
        strcpy(pr->hostname, org->hostname);
        pr->port = org->port;   
        pr->c = new_sock_channel(org->backhandle, s);
@@ -435,8 +439,8 @@ static int pfd_accepting(Plug p, void *sock)
 /* Add a new forwarding from port -> desthost:destport
  sets up a listener on the local machine on (srcaddr:)port
  */
-char *pfd_addforward(char *desthost, int destport, char *srcaddr, int port,
-                    void *backhandle, const Config *cfg)
+const char *pfd_addforward(char *desthost, int destport, char *srcaddr,
+                          int port, void *backhandle, const Config *cfg)
 {
     static const struct plug_function_table fn_table = {
        pfd_closing,
@@ -445,7 +449,7 @@ char *pfd_addforward(char *desthost, int destport, char *srcaddr, int port,
        pfd_accepting
     };
 
-    char *err;
+    const char *err;
     struct PFwdPrivate *pr;
     Socket s;