[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