Enlightenment CVS committal

Author  : tsauerbeck
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_con


Modified Files:
        ecore_con.c 


Log Message:
fixed ssl deadlock
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -3 -r1.25 -r1.26
--- ecore_con.c 23 Apr 2004 07:24:36 -0000      1.25
+++ ecore_con.c 25 Apr 2004 15:42:57 -0000      1.26
@@ -1,3 +1,7 @@
+/*
+ * vim:ts=8:sw=3
+ */
+
 #include "Ecore.h"
 #include "config.h"
 #include "ecore_private.h"
@@ -730,6 +734,10 @@
 }
 
 #if USE_OPENSSL
+/* Tries to connect an Ecore_Con_Server to an SSL host.
+ * Returns 1 on success, -1 on fatal errors and 0 if the caller
+ * should try again later.
+ */
 static int
 svr_try_connect_ssl(Ecore_Con_Server *svr)
 {
@@ -742,11 +750,36 @@
    if (ssl_err == SSL_ERROR_NONE) return 1;
    if (ssl_err == SSL_ERROR_WANT_READ)       flag = ECORE_FD_READ;
    else if (ssl_err == SSL_ERROR_WANT_WRITE) flag = ECORE_FD_WRITE;
+   else return -1;
    if (flag) ecore_main_fd_handler_active_set(svr->fd_handler, flag);
    return 0;
 }
 #endif
 
+static void
+kill_server(Ecore_Con_Server *svr)
+{
+   Ecore_Con_Event_Server_Del *e;
+
+   e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
+   if (e)
+   {
+      e->server = svr;
+      ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
+           _ecore_con_event_server_del_free, NULL);
+   }
+
+   svr->dead = 1;
+   ecore_main_fd_handler_del(svr->fd_handler);
+   svr->fd_handler = NULL;
+
+   if (svr->read_buf)
+   {
+      free(svr->read_buf);
+      svr->read_buf = NULL;
+   }
+}
+
 static int
 svr_try_connect(Ecore_Con_Server *svr)
 {
@@ -758,18 +791,7 @@
    if (so_err != 0)
      {
        /* we lost our server! */
-       Ecore_Con_Event_Server_Del *e;
-       
-       e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
-       if (e)
-         {
-            e->server = svr;
-            ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
-                            _ecore_con_event_server_del_free, NULL);
-         }
-       svr->dead = 1;
-       ecore_main_fd_handler_del(svr->fd_handler);
-       svr->fd_handler = NULL;
+       kill_server(svr);
      }
    else
      {
@@ -807,11 +829,17 @@
        int            inbuf_num = 0;
 
 #if USE_OPENSSL
-       if ((svr->ssl) && 
-           (svr->connecting) && 
-           (svr_try_connect_ssl(svr)) &&
-           (!svr_try_connect(svr)))
-         return 1;
+       if (svr->ssl && svr->connecting) {
+          switch (svr_try_connect_ssl(svr)) {
+             case 1:
+                if (!svr_try_connect(svr))
+                   return 1;
+                break;
+             case -1:
+                kill_server(svr);
+                return 1;
+          }
+       }
 #endif
        
        for (;;)
@@ -863,23 +891,7 @@
                  if (lost_server)
                    {
                       /* we lost our server! */
-                      Ecore_Con_Event_Server_Del *e;
-                      
-                      e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
-                      if (e)
-                        {
-                           e->server = svr;
-                           ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
-                                           _ecore_con_event_server_del_free, NULL);
-                        }
-                      svr->dead = 1;
-                      ecore_main_fd_handler_del(svr->fd_handler);
-                      svr->fd_handler = NULL;
-                      if (svr->read_buf)
-                        {
-                           free(svr->read_buf);
-                           svr->read_buf = NULL;
-                        }
+                      kill_server(svr);
                       return 1;
                    }
                  break;
@@ -908,25 +920,18 @@
               {
 #endif
                  if (!svr_try_connect(svr))
-                   {
-                      if (svr->read_buf)
-                        {
-                           free(svr->read_buf);
-                           svr->read_buf = NULL;
-                        }
                       return 1;
-                   }
 #if USE_OPENSSL
               }
-            else if ((svr_try_connect_ssl(svr)) && (!svr_try_connect(svr)))
-              {
-                 if (svr->read_buf)
-                   {
-                      free(svr->read_buf);
-                      svr->read_buf = NULL;
-                   }
-                 return 1;
-              }
+            else
+               switch (svr_try_connect_ssl(svr)) {
+                  case 1:
+                     if (!svr_try_connect(svr))
+                        return 1;
+                  case -1:
+                     kill_server(svr);
+                     return 1;
+               }
 #endif
          }
        _ecore_con_server_flush(svr);
@@ -1052,19 +1057,7 @@
    if (lost_server)
      {
        /* we lost our server! */
-       Ecore_Con_Event_Server_Del *e;
-       
-       e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
-       if (e)
-         {
-            e->server = svr;
-            ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
-                            _ecore_con_event_server_del_free, NULL);
-         }
-       
-       svr->dead = 1;
-       ecore_main_fd_handler_del(svr->fd_handler);
-       svr->fd_handler = NULL;
+       kill_server(svr);
        return;
      }
 




-------------------------------------------------------
This SF.net email is sponsored by: The Robotic Monkeys at ThinkGeek
For a limited time only, get FREE Ground shipping on all orders of $35
or more. Hurry up and shop folks, this offer expires April 30th!
http://www.thinkgeek.com/freeshipping/?cpg=12297
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to