nc: fix "nc -nl -p LPORT RHOST" case (was expecting remote port 0). closes bug 837
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 8 Jan 2010 15:09:45 +0000 (16:09 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 8 Jan 2010 15:09:45 +0000 (16:09 +0100)
function                                             old     new   delta
dolisten                                             742     830     +88

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/nc_bloaty.c

index 9d7c23dee5b6d660f863131118ce4dbb25b74726..e14d512ed1b6e4d7070346a29cee4a62ef2948b3 100644 (file)
@@ -340,16 +340,29 @@ create new one, and bind() it. TODO */
                        rr = accept(netfd, &remend.u.sa, &remend.len);
                        if (rr < 0)
                                bb_perror_msg_and_die("accept");
-                       if (themaddr && memcmp(&remend.u.sa, &themaddr->u.sa, remend.len) != 0) {
-                               /* nc 1.10 bails out instead, and its error message
-                                * is not suppressed by o_verbose */
-                               if (o_verbose) {
-                                       char *remaddr = xmalloc_sockaddr2dotted(&remend.u.sa);
-                                       bb_error_msg("connect from wrong ip/port %s ignored", remaddr);
-                                       free(remaddr);
+                       if (themaddr) {
+                               int sv_port, port, r;
+
+                               sv_port = get_nport(&remend.u.sa); /* save */
+                               port = get_nport(&themaddr->u.sa);
+                               if (port == 0) {
+                                       /* "nc -nl -p LPORT RHOST" (w/o RPORT!):
+                                        * we should accept any remote port */
+                                       set_nport(&remend, 0); /* blot out remote port# */
+                               }
+                               r = memcmp(&remend.u.sa, &themaddr->u.sa, remend.len);
+                               set_nport(&remend, sv_port); /* restore */
+                               if (r != 0) {
+                                       /* nc 1.10 bails out instead, and its error message
+                                        * is not suppressed by o_verbose */
+                                       if (o_verbose) {
+                                               char *remaddr = xmalloc_sockaddr2dotted(&remend.u.sa);
+                                               bb_error_msg("connect from wrong ip/port %s ignored", remaddr);
+                                               free(remaddr);
+                                       }
+                                       close(rr);
+                                       goto again;
                                }
-                               close(rr);
-                               goto again;
                        }
                        unarm();
                } else