SC in "finding an actual bug" shocker! Set the port number before passing
[sgt/putty] / portfwd.c
index 16f001a..7684b18 100644 (file)
--- a/portfwd.c
+++ b/portfwd.c
@@ -126,8 +126,8 @@ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c)
     /*
      * Try to find host.
      */
-    addr = sk_namelookup(hostname, &dummy_realhost);
-    if ((err = sk_addr_error(addr)))
+    addr = name_lookup(hostname, port, &dummy_realhost);
+    if ((err = sk_addr_error(addr)) != NULL)
        return err;
 
     /*
@@ -141,7 +141,7 @@ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c)
     pr->backhandle = NULL;            /* we shouldn't need this */
 
     pr->s = *s = new_connection(addr, dummy_realhost, port, 0, 1, 0, (Plug) pr);
-    if ((err = sk_socket_error(*s))) {
+    if ((err = sk_socket_error(*s)) != NULL) {
        sfree(pr);
        return err;
     }
@@ -175,7 +175,7 @@ static int pfd_accepting(Plug p, void *sock)
     pr->backhandle = org->backhandle;
 
     pr->s = s = sk_register(sock, (Plug) pr);
-    if ((err = sk_socket_error(s))) {
+    if ((err = sk_socket_error(s)) != NULL) {
        sfree(pr);
        return err != NULL;
     }
@@ -203,9 +203,10 @@ 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 port
+ sets up a listener on the local machine on (srcaddr:)port
  */
-char *pfd_addforward(char *desthost, int destport, int port, void *backhandle)
+char *pfd_addforward(char *desthost, int destport, char *srcaddr, int port,
+                    void *backhandle)
 {
     static struct plug_function_table fn_table = {
        pfd_closing,
@@ -231,8 +232,8 @@ char *pfd_addforward(char *desthost, int destport, int port, void *backhandle)
     pr->waiting = NULL;
     pr->backhandle = backhandle;
 
-    pr->s = s = new_listener(port, (Plug) pr, !cfg.lport_acceptall);
-    if ((err = sk_socket_error(s))) {
+    pr->s = s = new_listener(srcaddr, port, (Plug) pr, !cfg.lport_acceptall);
+    if ((err = sk_socket_error(s)) != NULL) {
        sfree(pr);
        return err;
     }