]> granicus.if.org Git - curl/commitdiff
T. Bharath's comments about SSL cleanup incorporated, and the two new
authorDaniel Stenberg <daniel@haxx.se>
Mon, 28 May 2001 14:12:43 +0000 (14:12 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 28 May 2001 14:12:43 +0000 (14:12 +0000)
curl_global_* functions

lib/easy.c
lib/ssluse.c
lib/ssluse.h
lib/url.c

index ead4da73adea453bc5e94cc049aebf68fb4eab57..2c0520a65bd2fbe87c1ed8556a328854aa515659 100644 (file)
 #include "urldata.h"
 #include <curl/curl.h>
 #include "transfer.h"
-#include <curl/types.h>
+#include "ssluse.h"
 
 #define _MPRINTF_REPLACE /* use our functions only */
 #include <curl/mprintf.h>
 
+CURLcode curl_global_init(void)
+{
+  Curl_SSL_init();
+  return CURLE_OK;
+}
+
+void curl_global_cleanup(void)
+{
+  Curl_SSL_cleanup();
+}
+
 CURL *curl_easy_init(void)
 {
   CURLcode res;
   struct UrlData *data;
 
+  /* Make sure we inited the global SSL stuff */
+  Curl_SSL_init();
+
   /* We use curl_open() with undefined URL so far */
   res = Curl_open((CURL **)&data, NULL);
   if(res != CURLE_OK)
index e8e3a4cf5204f173ca881f98748f25ddd9ccca93..3707a4965e88fcd66cbb01344134f418e8986f42 100644 (file)
@@ -235,6 +235,40 @@ int cert_verify_callback(int ok, X509_STORE_CTX *ctx)
 
 #endif
 
+/* Global init */
+void Curl_SSL_init(void)
+{
+#ifdef USE_SSLEAY
+  static int only_once=0;
+
+  /* make sure this is only done once */
+  if(0 != only_once)
+    return;
+
+  only_once++; /* never again */
+
+  /* Lets get nice error messages */
+  SSL_load_error_strings();
+
+  /* Setup all the global SSL stuff */
+  SSLeay_add_ssl_algorithms();
+#endif
+}
+
+/* Global cleanup */
+void Curl_SSL_cleanup(void)
+{
+#ifdef USE_SSLEAY
+  /* Free the SSL error strings */
+  ERR_free_strings();
+  
+  /* EVP_cleanup() removes all ciphers and digests from the
+     table. */
+  EVP_cleanup();
+#endif  
+}
+
+
 /* ====================================================== */
 CURLcode
 Curl_SSLConnect(struct connectdata *conn)
@@ -250,15 +284,9 @@ Curl_SSLConnect(struct connectdata *conn)
   /* mark this is being ssl enabled from here on out. */
   conn->ssl.use = TRUE;
 
-  /* Lets get nice error messages */
-  SSL_load_error_strings();
-
   /* Make funny stuff to get random input */
   random_the_seed(conn);
     
-  /* Setup all the global SSL stuff */
-  SSLeay_add_ssl_algorithms();
-
   switch(data->ssl.version) {
   default:
     req_method = SSLv23_client_method();
index d211c1cb4834089f7e8d26612152f772aab06ddc..645970f4bd5e293a2071496d11dfc7ddde49608b 100644 (file)
@@ -24,4 +24,8 @@
  *****************************************************************************/
 #include "urldata.h"
 CURLcode Curl_SSLConnect(struct connectdata *conn);
+/* Global SSL init */
+void Curl_SSL_init(void);
+/* Global SSL cleanup */
+void Curl_SSL_cleanup(void);
 #endif
index 364e1088170d31b42266d3d0078f4da22085b087..726e259ca036e5f88b03f605066f93066d0d377a 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -833,6 +833,17 @@ CURLcode Curl_disconnect(struct connectdata *conn)
 
 #ifdef USE_SSLEAY
   if (conn->ssl.use) {
+    /*
+      ERR_remove_state() frees the error queue associated with
+      thread pid.  If pid == 0, the current thread will have its
+      error queue removed.
+
+      Since error queue data structures are allocated
+      automatically for new threads, they must be freed when
+      threads are terminated in oder to avoid memory leaks.
+    */
+    ERR_remove_state(0);
+
     if(conn->ssl.handle) {
       (void)SSL_shutdown(conn->ssl.handle);
       SSL_set_connect_state(conn->ssl.handle);