[Spread-cvs] commit: r881 - trunk/daemon

jschultz at spread.org jschultz at spread.org
Mon Jan 23 07:02:19 EST 2017


Author: jschultz
Date: 2017-01-23 07:02:19 -0500 (Mon, 23 Jan 2017)
New Revision: 881

Modified:
   trunk/daemon/session.c
Log:
daemon/session.c: Delay closing of an operational file descriptor until we are actually removing it, rather than just when we won't use it anymore.

Thanks to Daniel Savarese for this bug report and patch!



Modified: trunk/daemon/session.c
===================================================================
--- trunk/daemon/session.c	2017-01-23 11:30:41 UTC (rev 880)
+++ trunk/daemon/session.c	2017-01-23 12:02:19 UTC (rev 881)
@@ -126,6 +126,37 @@
 static  void    Sess_create_reject_message ( message_obj *msg );
 static  int     Sess_get_p2p_dests( int num_groups, char groups[][MAX_GROUP_NAME], char dests[][MAX_GROUP_NAME] );
 
+static void Sess_clear_session(session *ses)
+{
+    while ( ses->num_mess > 0 )
+    {
+        message_link* mess_link = ses->first;
+        
+        ses->first = ses->first->next;
+        Sess_dispose_message( mess_link );
+        ses->num_mess--;
+    }
+
+    ses->first = ses->last = NULL;
+
+    if ( ses->read_mess != NULL )
+    {
+        Message_dispose_message( ses->read_mess );
+        ses->read_mess = NULL;
+    }
+
+    Message_reset_current_location( &ses->read );
+    Message_reset_current_location( &ses->write );
+    ses->read.in_mess_head = 1;
+
+    ses->status = Clear_op_session( ses->status );
+
+    E_dequeue( Sess_badger_TO, ses->mbox, NULL );
+    E_detach_fd( ses->mbox, READ_FD );
+    E_detach_fd( ses->mbox, EXCEPT_FD );
+    E_detach_fd( ses->mbox, WRITE_FD );
+}
+
 static void Sess_free_session(session *ses)
 {
     ses->sort_next = Sessions_free;
@@ -249,6 +280,10 @@
 
     ses->sort_prev = NULL;
     ses->sort_next = NULL;
+
+    close( ses->mbox );
+    ses->mbox = -1;
+
     Sess_free_session(ses);
 }
 
@@ -983,7 +1018,6 @@
         Alarm( SESSION, "Sess_session_denied: Authorization denied for %s on mailbox %d\n",
                Sessions[ses].name,
                Sessions[ses].mbox );
-        close( Sessions[ses].mbox );
 
         Sess_unhash_session (&Sessions[ses]);
 	Sess_remove_session (&Sessions[ses]);
@@ -1127,7 +1161,6 @@
         message_obj     *msg;
         scatter         *scat;
 	down_link	*down_ptr;
-        message_link    *mess_link;
 	int		packet_index, byte_index, to_read;
 	int             len, remain, ret;
         int             head_size, data_frag_len;
@@ -1420,24 +1453,9 @@
                  */
                 Log_sess_disconnect( Sessions[ses].mbox, &Sessions[ses].addr, Sessions[ses].name,
                                      Sessions[ses].num_mess );
-                
-                /* clear his structure */
-                while( Sessions[ses].num_mess > 0 )
-                {
-                        mess_link = Sessions[ses].first;
-                        Sessions[ses].first = Sessions[ses].first->next;
-                        Sess_dispose_message( mess_link );
-                        Sessions[ses].num_mess--;
-                }
 
-                /* close the mailbox and mark it unoperational */
-                E_dequeue( Sess_badger_TO, mbox, NULL );
-                E_detach_fd( mbox, READ_FD );
-                E_detach_fd( mbox, EXCEPT_FD );
-		E_detach_fd( mbox, WRITE_FD );
-                close( mbox );
-                /* the mailbox is closed but the entry still points to it */
-                Sessions[ses].status = Clear_op_session( Sessions[ses].status );
+                Sess_clear_session( &Sessions[ses] );
+                
                 Alarm( SESSION, "Sess_read: disconnecting session %s ( mailbox %d )\n",Sessions[ses].name, mbox );
         }
 
@@ -1750,7 +1768,6 @@
 static	void	Sess_kill( mailbox mbox )
 {
 	int		ses;
-	message_link	*mess_link;
 	message_obj	*kill_mess;
         message_header  *kill_head;
 	down_link	*down_ptr;
@@ -1790,30 +1807,9 @@
 
 	Log_sess_disconnect( Sessions[ses].mbox, &Sessions[ses].addr, Sessions[ses].name,
 			     Sessions[ses].num_mess );
-        
-	/* clear his structure */
-	while( Sessions[ses].num_mess > 0 )
-	{
-		mess_link = Sessions[ses].first;
-		Sessions[ses].first = Sessions[ses].first->next;
-		Sess_dispose_message( mess_link );
-		Sessions[ses].num_mess--;
-	}
-        /* reset active read_mess to empty */
-        Message_reset_current_location(&(Sessions[ses].read));
-        Sessions[ses].read.in_mess_head = 1;
-        if (Sessions[ses].read_mess != NULL)
-            Message_dispose_message( Sessions[ses].read_mess );
-        Sessions[ses].read_mess = NULL;
 
-	/* close the mailbox and mark it unoperational */
-	E_dequeue( Sess_badger_TO, mbox, NULL );
-	E_detach_fd( mbox, READ_FD );
-	E_detach_fd( mbox, EXCEPT_FD );
-	E_detach_fd( mbox, WRITE_FD );
-        close(mbox);
-	/* the mailbox is closed but the entry still points to it */
-	Sessions[ses].status = Clear_op_session( Sessions[ses].status );
+        Sess_clear_session( &Sessions[ses] );
+
 	Alarm( SESSION, "Sess_kill: killing session %s ( mailbox %d )\n",Sessions[ses].name, mbox );
 }
 




More information about the Spread-cvs mailing list