X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/ab0873ab80d0c927315329be0cbeb96bb4ace89a..f85e6f6edb2c9415bc10bd2015479d72ea8c5ae2:/winnet.c diff --git a/winnet.c b/winnet.c index 0b93fcd2..c211f539 100644 --- a/winnet.c +++ b/winnet.c @@ -59,7 +59,7 @@ ((ntohl(addr.s_addr) & 0xFF000000L) == 0x7F000000L) struct Socket_tag { - struct socket_function_table *fn; + const struct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ char *error; SOCKET s; @@ -224,9 +224,9 @@ char *winsock_error_string(int error) } } -SockAddr sk_namelookup(char *host, char **canonicalname) +SockAddr sk_namelookup(const char *host, char **canonicalname) { - SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); + SockAddr ret = snew(struct SockAddr_tag); unsigned long a; struct hostent *h = NULL; char realhost[8192]; @@ -357,14 +357,14 @@ SockAddr sk_namelookup(char *host, char **canonicalname) } ret->address = ntohl(a); realhost[lenof(realhost)-1] = '\0'; - *canonicalname = smalloc(1+strlen(realhost)); + *canonicalname = snewn(1+strlen(realhost), char); strcpy(*canonicalname, realhost); return ret; } -SockAddr sk_nonamelookup(char *host) +SockAddr sk_nonamelookup(const char *host) { - SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); + SockAddr ret = snew(struct SockAddr_tag); ret->error = NULL; ret->family = AF_UNSPEC; strncpy(ret->hostname, host, lenof(ret->hostname)); @@ -460,18 +460,18 @@ static void sk_tcp_flush(Socket s) } static void sk_tcp_close(Socket s); -static int sk_tcp_write(Socket s, char *data, int len); -static int sk_tcp_write_oob(Socket s, char *data, int len); +static int sk_tcp_write(Socket s, const char *data, int len); +static int sk_tcp_write_oob(Socket s, const char *data, int len); static void sk_tcp_set_private_ptr(Socket s, void *ptr); static void *sk_tcp_get_private_ptr(Socket s); static void sk_tcp_set_frozen(Socket s, int is_frozen); -static char *sk_tcp_socket_error(Socket s); +static const char *sk_tcp_socket_error(Socket s); extern char *do_select(SOCKET skt, int startup); Socket sk_register(void *sock, Plug plug) { - static struct socket_function_table fn_table = { + static const struct socket_function_table fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, @@ -490,7 +490,7 @@ Socket sk_register(void *sock, Plug plug) /* * Create Socket structure. */ - ret = smalloc(sizeof(struct Socket_tag)); + ret = snew(struct Socket_tag); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; @@ -528,7 +528,7 @@ Socket sk_register(void *sock, Plug plug) Socket sk_new(SockAddr addr, int port, int privport, int oobinline, int nodelay, Plug plug) { - static struct socket_function_table fn_table = { + static const struct socket_function_table fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, @@ -553,7 +553,7 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, /* * Create Socket structure. */ - ret = smalloc(sizeof(struct Socket_tag)); + ret = snew(struct Socket_tag); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; @@ -701,12 +701,15 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, add234(sktree, ret); + /* We're done with 'addr' now. */ + sk_addr_free(addr); + return (Socket) ret; } Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) { - static struct socket_function_table fn_table = { + static const struct socket_function_table fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, @@ -732,7 +735,7 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) /* * Create Socket structure. */ - ret = smalloc(sizeof(struct Socket_tag)); + ret = snew(struct Socket_tag); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; @@ -924,7 +927,7 @@ void try_send(Actual_Socket s) } } -static int sk_tcp_write(Socket sock, char *buf, int len) +static int sk_tcp_write(Socket sock, const char *buf, int len) { Actual_Socket s = (Actual_Socket) sock; @@ -942,7 +945,7 @@ static int sk_tcp_write(Socket sock, char *buf, int len) return bufchain_size(&s->output_data); } -static int sk_tcp_write_oob(Socket sock, char *buf, int len) +static int sk_tcp_write_oob(Socket sock, const char *buf, int len) { Actual_Socket s = (Actual_Socket) sock; @@ -973,23 +976,8 @@ int select_result(WPARAM wParam, LPARAM lParam) /* wParam is the socket itself */ - /* - * One user has reported an assertion failure in tree234 which - * indicates a null element pointer has been passed to a - * find*234 function. The following find234 is the only one in - * the whole program that I can see being capable of doing - * this, hence I'm forced to conclude that WinSock is capable - * of sending me netevent messages with wParam==0. I want to - * know what the rest of the message is if it does so! - */ - if (wParam == 0) { - char *str; - str = dupprintf("Strange WinSock message: wp=%08x lp=%08x", - (int)wParam, (int)lParam); - logevent(NULL, str); - connection_fatal(NULL, str); - sfree(str); - } + if (wParam == 0) + return 1; /* boggle */ s = find234(sktree, (void *) wParam, cmpforsearch); if (!s) @@ -1188,11 +1176,11 @@ static void *sk_tcp_get_private_ptr(Socket sock) * if there's a problem. These functions extract an error message, * or return NULL if there's no problem. */ -char *sk_addr_error(SockAddr addr) +const char *sk_addr_error(SockAddr addr) { return addr->error; } -static char *sk_tcp_socket_error(Socket sock) +static const char *sk_tcp_socket_error(Socket sock) { Actual_Socket s = (Actual_Socket) sock; return s->error;