1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-22 14:39:24 -05:00

Port forwarding update: local-host-only listening sockets are now

done properly (by binding to INADDR_LOOPBACK) instead of hackishly
(by binding to INADDR_ANY, looking at the peer address when a
connection is accepted, and slamming the connection shut at that
point).

[originally from svn r1215]
This commit is contained in:
Simon Tatham 2001-08-27 15:59:37 +00:00
parent ac97a0cb1d
commit 4692974d7d
3 changed files with 30 additions and 29 deletions

View File

@ -54,7 +54,7 @@ struct plug_function_table {
* on a socket is cleared or partially cleared. The new backlog * on a socket is cleared or partially cleared. The new backlog
* size is passed in the `bufsize' parameter. * size is passed in the `bufsize' parameter.
*/ */
int (*accepting)(Plug p, struct sockaddr *addr, void *sock); int (*accepting)(Plug p, void *sock);
/* /*
* returns 0 if the host at address addr is a valid host for connecting or error * returns 0 if the host at address addr is a valid host for connecting or error
*/ */
@ -69,7 +69,7 @@ void sk_addr_free(SockAddr addr);
Socket sk_new(SockAddr addr, int port, int privport, int oobinline, Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
Plug p); Plug p);
Socket sk_newlistenner(int port, Plug plug); Socket sk_newlistener(int port, Plug plug, int local_host_only);
Socket sk_register(void *sock, Plug plug); Socket sk_register(void *sock, Plug plug);
@ -83,7 +83,7 @@ Socket sk_register(void *sock, Plug plug);
#define plug_closing(p,msg,code,callback) (((*p)->closing) (p, msg, code, callback)) #define plug_closing(p,msg,code,callback) (((*p)->closing) (p, msg, code, callback))
#define plug_receive(p,urgent,buf,len) (((*p)->receive) (p, urgent, buf, len)) #define plug_receive(p,urgent,buf,len) (((*p)->receive) (p, urgent, buf, len))
#define plug_sent(p,bufsize) (((*p)->sent) (p, bufsize)) #define plug_sent(p,bufsize) (((*p)->sent) (p, bufsize))
#define plug_accepting(p, addr, sock) (((*p)->accepting)(p, addr, sock)) #define plug_accepting(p, sock) (((*p)->accepting)(p, sock))
#endif #endif
/* /*

View File

@ -153,9 +153,8 @@ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c)
called when someone connects to the local port called when someone connects to the local port
*/ */
static int pfd_accepting(Plug p, struct sockaddr *addr, void *sock) static int pfd_accepting(Plug p, void *sock)
{ {
/* for now always accept this socket */
static struct plug_function_table fn_table = { static struct plug_function_table fn_table = {
pfd_closing, pfd_closing,
pfd_receive, pfd_receive,
@ -163,13 +162,9 @@ static int pfd_accepting(Plug p, struct sockaddr *addr, void *sock)
NULL NULL
}; };
struct PFwdPrivate *pr, *org; struct PFwdPrivate *pr, *org;
struct sockaddr_in *sin = (struct sockaddr_in *)addr;
Socket s; Socket s;
char *err; char *err;
if (ntohl(sin->sin_addr.s_addr) != 0x7F000001 && !cfg.lport_acceptall)
return 1; /* denied */
org = (struct PFwdPrivate *)p; org = (struct PFwdPrivate *)p;
pr = (struct PFwdPrivate *) smalloc(sizeof(struct PFwdPrivate)); pr = (struct PFwdPrivate *) smalloc(sizeof(struct PFwdPrivate));
pr->fn = &fn_table; pr->fn = &fn_table;
@ -205,7 +200,7 @@ static int pfd_accepting(Plug p, struct sockaddr *addr, void *sock)
/* Add a new forwarding from port -> desthost:destport /* Add a new forwarding from port -> desthost:destport
sets up a listenner on the local machine on port sets up a listener on the local machine on port
*/ */
char *pfd_addforward(char *desthost, int destport, int port) char *pfd_addforward(char *desthost, int destport, int port)
{ {
@ -232,7 +227,7 @@ char *pfd_addforward(char *desthost, int destport, int port)
pr->ready = 0; pr->ready = 0;
pr->waiting = NULL; pr->waiting = NULL;
pr->s = s = sk_newlistenner(port, (Plug) pr); pr->s = s = sk_newlistener(port, (Plug) pr, !cfg.lport_acceptall);
if ((err = sk_socket_error(s))) { if ((err = sk_socket_error(s))) {
sfree(pr); sfree(pr);
return err; return err;

View File

@ -570,7 +570,7 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
return (Socket) ret; return (Socket) ret;
} }
Socket sk_newlistenner(int port, Plug plug) Socket sk_newlistener(int port, Plug plug, int local_host_only)
{ {
static struct socket_function_table fn_table = { static struct socket_function_table fn_table = {
sk_tcp_plug, sk_tcp_plug,
@ -627,12 +627,18 @@ Socket sk_newlistenner(int port, Plug plug)
if (addr->family == AF_INET6) { if (addr->family == AF_INET6) {
memset(&a6, 0, sizeof(a6)); memset(&a6, 0, sizeof(a6));
a6.sin6_family = AF_INET6; a6.sin6_family = AF_INET6;
/*a6.sin6_addr = in6addr_any; *//* == 0 */ if (local_host_only)
a6.sin6_addr = in6addr_loopback;
else
a6.sin6_addr = in6addr_any;
a6.sin6_port = htons(port); a6.sin6_port = htons(port);
} else } else
#endif #endif
{ {
a.sin_family = AF_INET; a.sin_family = AF_INET;
if (local_host_only)
a.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
else
a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_addr.s_addr = htonl(INADDR_ANY);
a.sin_port = htons((short)port); a.sin_port = htons((short)port);
} }
@ -923,8 +929,8 @@ int select_result(WPARAM wParam, LPARAM lParam)
break; break;
} }
if (plug_accepting(s->plug, &isa, (void*)t)) { if (plug_accepting(s->plug, (void*)t)) {
closesocket(t); // denied or error closesocket(t); /* denied or error */
} }
} }
} }