gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r14752 - libmicrohttpd/src/daemon


From: gnunet
Subject: [GNUnet-SVN] r14752 - libmicrohttpd/src/daemon
Date: Mon, 28 Mar 2011 09:15:05 +0200

Author: grothoff
Date: 2011-03-28 09:15:05 +0200 (Mon, 28 Mar 2011)
New Revision: 14752

Modified:
   libmicrohttpd/src/daemon/daemon.c
Log:
fixing leaks on error handling

Modified: libmicrohttpd/src/daemon/daemon.c
===================================================================
--- libmicrohttpd/src/daemon/daemon.c   2011-03-28 07:03:15 UTC (rev 14751)
+++ libmicrohttpd/src/daemon/daemon.c   2011-03-28 07:15:05 UTC (rev 14752)
@@ -1993,12 +1993,14 @@
              return NULL;
            }
     }
+
   if (0 != pthread_mutex_init (&retVal->nnc_lock, NULL))
     {
 #if HAVE_MESSAGES
       MHD_DLOG (retVal,
                "MHD failed to initialize nonce-nc mutex\n");
 #endif
+      free (retVal->nnc);
       free (retVal);
       return NULL;
     }
@@ -2012,8 +2014,7 @@
       MHD_DLOG (retVal,
                "MHD thread pooling only works with 
MHD_USE_SELECT_INTERNALLY\n");
 #endif
-      free (retVal);
-      return NULL;
+      goto free_and_fail;
     }
 
 #ifdef __SYMBIAN32__
@@ -2023,8 +2024,7 @@
       MHD_DLOG (retVal,
                "Threaded operations are not supported on Symbian.\n");
 #endif
-      free (retVal);
-      return NULL;
+      goto free_and_fail;
     }
 #endif
   if (retVal->socket_fd == -1)
@@ -2038,8 +2038,7 @@
        MHD_DLOG (retVal, 
                  "AF_INET6 not supported\n");
 #endif
-       free (retVal);
-       return NULL;
+       goto free_and_fail;
       }
 #endif
       else
@@ -2052,8 +2051,7 @@
                      "Call to socket failed: %s\n", 
                      STRERROR (errno));
 #endif
-         free (retVal);
-         return NULL;
+         goto free_and_fail;
        }
       if ((SETSOCKOPT (socket_fd,
                       SOL_SOCKET,
@@ -2127,8 +2125,7 @@
                      STRERROR (errno));
 #endif
          CLOSE (socket_fd);
-         free (retVal);
-         return NULL;
+         goto free_and_fail;
        }
       
       if (LISTEN (socket_fd, 20) < 0)
@@ -2140,8 +2137,7 @@
                      STRERROR (errno));
 #endif
          CLOSE (socket_fd);
-         free (retVal);
-         return NULL;
+         goto free_and_fail;
        }      
     }
   else
@@ -2160,8 +2156,7 @@
                  FD_SETSIZE);
 #endif
       CLOSE (socket_fd);
-      free (retVal);
-      return NULL;
+      goto free_and_fail;
     }
 #endif
 
@@ -2172,8 +2167,7 @@
                "MHD failed to initialize IP connection limit mutex\n");
 #endif
       CLOSE (socket_fd);
-      free (retVal);
-      return NULL;
+      goto free_and_fail;
     }
 
 #if HTTPS_SUPPORT
@@ -2185,13 +2179,8 @@
                "Failed to initialize TLS support\n");
 #endif
       CLOSE (socket_fd);
-#ifdef DAUTH_SUPPORT
-      pthread_mutex_destroy (&retVal->nnc_lock);
-      free (retVal->nnc);
-#endif
       pthread_mutex_destroy (&retVal->per_ip_connection_mutex);
-      free (retVal);
-      return NULL;
+      goto free_and_fail;
     }
 #endif
   if ( ( (0 != (options & MHD_USE_THREAD_PER_CONNECTION)) ||
@@ -2205,14 +2194,9 @@
                 "Failed to create listen thread: %s\n", 
                STRERROR (res_thread_create));
 #endif
-#ifdef DAUTH_SUPPORT
-      pthread_mutex_destroy (&retVal->nnc_lock);
-      free (retVal->nnc);
-#endif
       pthread_mutex_destroy (&retVal->per_ip_connection_mutex);
-      free (retVal);
       CLOSE (socket_fd);
-      return NULL;
+      goto free_and_fail;
     }
   if (retVal->worker_pool_size > 0)
     {
@@ -2306,8 +2290,7 @@
       pthread_mutex_destroy (&retVal->per_ip_connection_mutex);
       if (NULL != retVal->worker_pool)
         free (retVal->worker_pool);
-      free (retVal);
-      return NULL;
+      goto free_and_fail;
     }
 
   /* Shutdown worker threads we've already created. Pretend
@@ -2317,11 +2300,23 @@
   retVal->worker_pool_size = i - 1;
   MHD_stop_daemon (retVal);
   return NULL;
+
+ free_and_fail:
+  /* clean up basic memory state in 'retVal' and return NULL to 
+     indicate failure */
+#ifdef DAUTH_SUPPORT
+  free (retVal->nnc);
+  pthread_mutex_destroy (&retVal->nnc_lock);
+#endif
+  free (retVal);
+  return NULL;
 }
 
 
 /**
  * Close all connections for the daemon
+ *
+ * @param daemon daemon to close down
  */
 static void
 MHD_close_connections (struct MHD_Daemon *daemon)
@@ -2345,6 +2340,8 @@
 
 /**
  * Shutdown an http daemon
+ *
+ * @param daemon daemon to stop
  */
 void
 MHD_stop_daemon (struct MHD_Daemon *daemon)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]