X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/cbe2d68fd7c7c7bac692b3a2d200a5d2429ab201..9bb8630af3373e7bbf594bfeda731585684e1b69:/unix/uxnet.c diff --git a/unix/uxnet.c b/unix/uxnet.c index 77a4885b..46b619bd 100644 --- a/unix/uxnet.c +++ b/unix/uxnet.c @@ -90,7 +90,7 @@ static int cmpfortree(void *av, void *bv) static int cmpforsearch(void *av, void *bv) { Actual_Socket b = (Actual_Socket) bv; - int as = (int) av, bs = b->s; + int as = *(int *)av, bs = b->s; if (as < bs) return -1; if (as > bs) @@ -336,7 +336,7 @@ static struct socket_function_table tcp_fn_table = { sk_tcp_socket_error }; -Socket sk_register(void *sock, Plug plug) +Socket sk_register(OSSocket sockfd, Plug plug) { Actual_Socket ret; @@ -357,7 +357,7 @@ Socket sk_register(void *sock, Plug plug) ret->oobpending = FALSE; ret->listener = 0; - ret->s = (int)sock; + ret->s = sockfd; if (ret->s < 0) { ret->error = error_string(errno); @@ -434,6 +434,11 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, else localport = 0; /* just use port 0 (ie kernel picks) */ + /* BSD IP stacks need sockaddr_in zeroed before filling in */ + memset(&a,'\0',sizeof(struct sockaddr_in)); +#ifdef IPV6 + memset(&a6,'\0',sizeof(struct sockaddr_in6)); +#endif /* Loop round trying to bind */ while (1) { int retcode; @@ -521,6 +526,8 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, uxsel_tell(ret); add234(sktree, ret); + sk_addr_free(addr); + return (Socket) ret; } @@ -572,7 +579,12 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)); + /* BSD IP stacks need sockaddr_in zeroed before filling in */ + memset(&a,'\0',sizeof(struct sockaddr_in)); #ifdef IPV6 +#if 0 + memset(&a6,'\0',sizeof(struct sockaddr_in6)); +#endif hints.ai_flags = AI_NUMERICHOST; hints.ai_family = AF_UNSPEC; hints.ai_socktype = 0; @@ -819,7 +831,7 @@ static int net_select_result(int fd, int event) u_long atmark; /* Find the Socket structure */ - s = find234(sktree, (void *) fd, cmpforsearch); + s = find234(sktree, &fd, cmpforsearch); if (!s) return 1; /* boggle */ @@ -869,14 +881,14 @@ static int net_select_result(int fd, int event) memset(&isa, 0, sizeof(struct sockaddr_in)); err = 0; - t = accept(s->s,(struct sockaddr *)&isa,&addrlen); + t = accept(s->s,(struct sockaddr *)&isa,(socklen_t *) &addrlen); if (t < 0) { break; } if (s->localhost_only && !ipv4_is_loopback(isa.sin_addr)) { close(t); /* someone let nonlocal through?! */ - } else if (plug_accepting(s->plug, (void*)t)) { + } else if (plug_accepting(s->plug, t)) { close(t); /* denied or error */ } break;