Mercurial > pidgin
diff src/upnp.c @ 11213:ff728e84d59a
[gaim-migrate @ 13344]
Changes by Adam Warrington
Fixes a crash on UPnP timeout
committer: Tailor Script <tailor@pidgin.im>
author | Thomas Butter <tbutter> |
---|---|
date | Mon, 08 Aug 2005 21:43:44 +0000 |
parents | a015b1cb7368 |
children | d3755a7ddd82 |
line wrap: on
line diff
--- a/src/upnp.c Mon Aug 08 19:56:41 2005 +0000 +++ b/src/upnp.c Mon Aug 08 21:43:44 2005 +0000 @@ -151,7 +151,7 @@ static void gaim_upnp_timeout(gpointer data, - gint source, + gint source, GaimInputCondition cond) { HRD* hrd = data; @@ -244,7 +244,7 @@ hrd->done = FALSE; hrd->recvBuffer = (char*)malloc(MAX_DESCRIPTION_RECIEVE_SIZE); - if(hrd == NULL) { + if(hrd->recvBuffer == NULL) { gaim_debug_info("upnp", "gaim_upnp_http_request(): Failed in recvBuffer MALLOC\n\n"); free(hrd); @@ -644,7 +644,6 @@ gaim_timeout_remove(hrd->tima); length = sizeof(struct sockaddr_in); - hrd->recvBuffer = (char*)malloc(MAX_DISCOVERY_RECIEVE_SIZE); do { sizeRecv = recvfrom(sock, hrd->recvBuffer, @@ -665,6 +664,7 @@ } + char* gaim_upnp_discover(void) { @@ -678,14 +678,19 @@ char *controlURL = NULL; HRD* hrd = (HRD*)malloc(sizeof(HRD)); - hrd->recvBuffer = NULL; - hrd->done = FALSE; + if(hrd == NULL) { + gaim_debug_info("upnp", + "gaim_upnp_discover(): Failed in hrd MALLOC\n\n"); + return NULL; + } sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) { close(sock); gaim_debug_info("upnp", "gaim_upnp_discover(): Failed In sock creation\n\n"); + free(hrd->recvBuffer); + free(hrd); return NULL; } @@ -695,6 +700,8 @@ close(sock); gaim_debug_info("upnp", "gaim_upnp_discover(): Failed In gethostbyname\n\n"); + free(hrd->recvBuffer); + free(hrd); return NULL; } @@ -710,6 +717,18 @@ recvSuccess = TRUE; totalSizeSent = 0; + hrd->recvBuffer = NULL; + hrd->totalSizeRecv = 0; + hrd->done = FALSE; + + hrd->recvBuffer = (char*)malloc(MAX_DISCOVERY_RECIEVE_SIZE); + if(hrd->recvBuffer == NULL) { + gaim_debug_info("upnp", + "gaim_upnp_discover(): Failed in hrd->recvBuffer MALLOC\n\n"); + free(hrd); + return NULL; + } + while(totalSizeSent < strlen(sendMessage)) { sizeSent = sendto(sock,(void*)&sendMessage[totalSizeSent], strlen(&sendMessage[totalSizeSent]),0, @@ -742,6 +761,8 @@ strlen(hrd->recvBuffer)))==NULL) { gaim_debug_info("upnp", "gaim_upnp_discover(): Failed In parse response\n\n"); + free(hrd->recvBuffer); + free(hrd); return NULL; } } @@ -752,6 +773,12 @@ i = NUM_UDP_ATTEMPTS; } } + + if(hrd->recvBuffer != NULL) { + free(hrd->recvBuffer); + } + free(hrd); + if(!sentSuccess || !recvSuccess) { close(sock); gaim_debug_info("upnp",