summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-01-08 15:09:45 (GMT)
committer Denys Vlasenko <vda.linux@googlemail.com>2010-01-08 15:09:45 (GMT)
commit866710a05616be518d9d32261b52c9f81a025fe1 (patch)
treea0e37831c32f0fa9f373714b5f79a90d837efdbd
parent8cd04d1cb658227d3c6eeb2a377314ca9cdf249d (diff)
downloadbusybox-866710a05616be518d9d32261b52c9f81a025fe1.tar.gz
busybox-866710a05616be518d9d32261b52c9f81a025fe1.tar.bz2
nc: fix "nc -nl -p LPORT RHOST" case (was expecting remote port 0). closes bug 837
function old new delta dolisten 742 830 +88 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/nc_bloaty.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/networking/nc_bloaty.c b/networking/nc_bloaty.c
index 9d7c23d..e14d512 100644
--- a/networking/nc_bloaty.c
+++ b/networking/nc_bloaty.c
@@ -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