diff --git a/tcp.c b/tcp.c index 515acbf..ad34220 100644 --- a/tcp.c +++ b/tcp.c @@ -135,7 +135,7 @@ int tcpconnect(struct server *server, struct timeval *when, int timeout, char *t /* returns 0 on timeout, -1 on error and num if ok */ int tcpreadtimeout(int s, unsigned char *buf, int num, int timeout) { int ndesc, cnt, len; - fd_set readfds, writefds; + fd_set readfds; struct timeval timer; if (s < 0) @@ -144,12 +144,11 @@ int tcpreadtimeout(int s, unsigned char *buf, int num, int timeout) { for (len = 0; len < num; len += cnt) { FD_ZERO(&readfds); FD_SET(s, &readfds); - writefds = readfds; if (timeout) { timer.tv_sec = timeout; timer.tv_usec = 0; } - ndesc = select(s + 1, &readfds, &writefds, NULL, timeout ? &timer : NULL); + ndesc = select(s + 1, &readfds, NULL, NULL, timeout ? &timer : NULL); if (ndesc < 1) return ndesc; @@ -322,6 +321,7 @@ void *tcpservernew(void *arg) { struct client *client; s = *(int *)arg; + free(arg); if (getpeername(s, (struct sockaddr *)&from, &fromlen)) { debug(DBG_DBG, "tcpservernew: getpeername failed, exiting"); goto exit; @@ -350,6 +350,7 @@ exit: void *tcplistener(void *arg) { pthread_t tcpserverth; int s, *sp = (int *)arg; + int *s_arg; struct sockaddr_storage from; socklen_t fromlen = sizeof(from); @@ -361,8 +362,11 @@ void *tcplistener(void *arg) { debug(DBG_WARN, "accept failed"); continue; } - if (pthread_create(&tcpserverth, &pthread_attr, tcpservernew, (void *)&s)) { + s_arg = malloc(sizeof(int)); + *s_arg = s; + if (pthread_create(&tcpserverth, &pthread_attr, tcpservernew, (void *)s_arg)) { debug(DBG_ERR, "tcplistener: pthread_create failed"); + free(s_arg); shutdown(s, SHUT_RDWR); close(s); continue; diff --git a/tls.c b/tls.c index 41defea..7397b71 100644 --- a/tls.c +++ b/tls.c @@ -402,6 +402,7 @@ void *tlsservernew(void *arg) { struct tls *accepted_tls = NULL; s = *(int *)arg; + free(arg); if (getpeername(s, (struct sockaddr *)&from, &fromlen)) { debug(DBG_DBG, "tlsservernew: getpeername failed, exiting"); goto exit; @@ -463,6 +464,7 @@ exit: void *tlslistener(void *arg) { pthread_t tlsserverth; int s, *sp = (int *)arg; + int *s_arg; struct sockaddr_storage from; socklen_t fromlen = sizeof(from); @@ -474,8 +476,11 @@ void *tlslistener(void *arg) { debug(DBG_WARN, "accept failed"); continue; } - if (pthread_create(&tlsserverth, &pthread_attr, tlsservernew, (void *)&s)) { + s_arg = malloc(sizeof(int)); + *s_arg = s; + if (pthread_create(&tlsserverth, &pthread_attr, tlsservernew, (void *)s_arg)) { debug(DBG_ERR, "tlslistener: pthread_create failed"); + free(s_arg); shutdown(s, SHUT_RDWR); close(s); continue;