diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/iproxy.c | 22 | 
1 files changed, 16 insertions, 6 deletions
| diff --git a/tools/iproxy.c b/tools/iproxy.c index bd9718c..75ffa7b 100644 --- a/tools/iproxy.c +++ b/tools/iproxy.c @@ -179,6 +179,7 @@ static void *acceptor_thread(void *arg)  		if (cdata->fd > 0) {  			close(cdata->fd);  		} +		free(cdata);  		return NULL;  	} @@ -190,6 +191,7 @@ static void *acceptor_thread(void *arg)  		if (cdata->fd > 0) {  			close(cdata->fd);  		} +		free(cdata);  		return NULL;  	} @@ -212,6 +214,7 @@ static void *acceptor_thread(void *arg)  		if (cdata->fd > 0) {  			close(cdata->fd);  		} +		free(cdata);  		return NULL;  	} @@ -239,6 +242,7 @@ static void *acceptor_thread(void *arg)  	if (cdata->sfd > 0) {  		close(cdata->sfd);  	} +	free(cdata);  	return NULL;  } @@ -282,20 +286,26 @@ int main(int argc, char **argv)  #endif  		struct sockaddr_in c_addr;  		socklen_t len = sizeof(struct sockaddr_in); -		struct client_data cdata; +		struct client_data *cdata;  		int c_sock;  		while (1) {  			printf("waiting for connection\n");  			c_sock = accept(mysock, (struct sockaddr*)&c_addr, &len);  			if (c_sock) {  				printf("accepted connection, fd = %d\n", c_sock); -				cdata.fd = c_sock; +				cdata = (struct client_data*)malloc(sizeof(struct client_data)); +				if (!cdata) { +					close(c_sock); +					fprintf(stderr, "ERROR: Out of memory\n"); +					return -1; +				} +				cdata->fd = c_sock;  #ifdef WIN32 -				acceptor = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)acceptor_thread, &cdata, 0, NULL); -				WaitForSingleObject(acceptor, INFINITE); +				acceptor = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)acceptor_thread, cdata, 0, NULL); +				CloseHandle(acceptor);  #else -				pthread_create(&acceptor, NULL, acceptor_thread, &cdata); -				pthread_join(acceptor, NULL); +				pthread_create(&acceptor, NULL, acceptor_thread, cdata); +				pthread_detach(acceptor);  #endif  			} else {  				break; | 
