From bc4802a17ba16140386b06bbebbf053815d4ef9e Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 12 Oct 2001 19:32:13 +0000 Subject: [PATCH] Due to fears that an incompetent WinSock might allow localhost- listening sockets to be talked to by non-local hosts, reinstate the explicit peer address check on connection acceptance. git-svn-id: svn://svn.tartarus.org/sgt/putty@1306 cda61777-01e9-0310-a592-d414129be87e --- winnet.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/winnet.c b/winnet.c index b6710472..b68846fa 100644 --- a/winnet.c +++ b/winnet.c @@ -68,6 +68,7 @@ struct Socket_tag { int frozen; /* this causes readability notifications to be ignored */ int frozen_readable; /* this means we missed at least one readability * notification while we were frozen */ + int localhost_only; /* for listening sockets */ char oobdata[1]; int sending_oob; int oobinline; @@ -410,6 +411,7 @@ Socket sk_register(void *sock, Plug plug) ret->sending_oob = 0; ret->frozen = 1; ret->frozen_readable = 0; + ret->localhost_only = 0; /* unused, but best init anyway */ ret->s = (SOCKET)sock; @@ -469,6 +471,7 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, ret->sending_oob = 0; ret->frozen = 0; ret->frozen_readable = 0; + ret->localhost_only = 0; /* unused, but best init anyway */ /* * Open socket. @@ -636,6 +639,7 @@ Socket sk_newlistener(int port, Plug plug, int local_host_only) ret->sending_oob = 0; ret->frozen = 0; ret->frozen_readable = 0; + ret->localhost_only = local_host_only; /* * Open socket. @@ -963,11 +967,11 @@ int select_result(WPARAM wParam, LPARAM lParam) return open; case FD_ACCEPT: { - struct sockaddr isa; - int addrlen = sizeof(struct sockaddr); + struct sockaddr_in isa; + int addrlen = sizeof(struct sockaddr_in); SOCKET t; /* socket of connection */ - memset(&isa, 0, sizeof(struct sockaddr)); + memset(&isa, 0, sizeof(struct sockaddr_in)); err = 0; t = accept(s->s,&isa,&addrlen); if (t == INVALID_SOCKET) @@ -977,7 +981,10 @@ int select_result(WPARAM wParam, LPARAM lParam) break; } - if (plug_accepting(s->plug, (void*)t)) { + if (s->localhost_only && + ntohl(isa.sin_addr.s_addr) != INADDR_LOOPBACK) { + closesocket(t); /* dodgy WinSock let nonlocal through */ + } else if (plug_accepting(s->plug, (void*)t)) { closesocket(t); /* denied or error */ } } -- 2.11.0