changeset 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 46086fcc82b7
children 751de30689ef
files src/network.c src/upnp.c src/upnp.h
diffstat 3 files changed, 38 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/network.c	Mon Aug 08 19:56:41 2005 +0000
+++ b/src/network.c	Mon Aug 08 21:43:44 2005 +0000
@@ -134,8 +134,8 @@
 const char *
 gaim_network_get_my_ip(int fd)
 {
-	const char *ip = NULL;
-  const char *controlURL = NULL;
+  char *ip = NULL;
+  char *controlURL = NULL;
 
 	/* Check if the user specified an IP manually */
 	if (!gaim_prefs_get_bool("/core/network/auto_ip")) {
@@ -147,6 +147,7 @@
   /* attempt to get the ip from a NAT device */
   if ((controlURL = gaim_upnp_discover()) != NULL) {
     ip = gaim_upnp_get_public_ip(controlURL);
+    free(controlURL);
     if (ip != NULL)
       return ip;
   }
@@ -160,7 +161,7 @@
 {
 	int listenfd = -1;
 	const int on = 1;
-  const char *controlURL = NULL;
+  char *controlURL = NULL;
 #if HAVE_GETADDRINFO
 	int errnum;
 	struct addrinfo hints, *res, *next;
@@ -236,6 +237,7 @@
       gaim_upnp_remove_port_mapping(controlURL, port, "TCP");
       gaim_upnp_set_port_mapping(controlURL, port, "TCP");
     }
+    free(controlURL);
   }
 
 	gaim_debug_info("network", "Listening on port: %hu\n", gaim_network_get_port_from_fd(listenfd));
--- 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",
--- a/src/upnp.h	Mon Aug 08 19:56:41 2005 +0000
+++ b/src/upnp.h	Mon Aug 08 21:43:44 2005 +0000
@@ -47,6 +47,7 @@
 char* gaim_upnp_discover(void);
 
 
+
 /**
  * Gets the IP address from a UPnP enabled IGD that sits on the local
  * network, so when getting the network IP, instead of returning the
@@ -67,7 +68,6 @@
  * @param controlURL The control URL retrieved from gaim_upnp_discover.
  * @param portMap The port to map to this client
  * @param protocol The protocol to map, either "TCP" or "UDP"
- * @param internalIP The internal IP to map to
  *
  * @return TRUE if success, FALSE if something went wrong.
  */