jonathan 05/04/07 00:00:57
Modified: daemon Changelog sp.c
Log:
Check for short writes on network socket sends in libsp and loop to finish
full write.
Bug reported by Tudor Dumitras.
Revision Changes Path
1.8 +5 -0 spread/daemon/Changelog
Index: Changelog
===================================================================
RCS file: /storage/cvsroot/spread/daemon/Changelog,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Changelog 7 Apr 2005 03:59:13 -0000 1.7
+++ Changelog 7 Apr 2005 04:00:57 -0000 1.8
@@ -1,3 +1,8 @@
+Thu Mar 31 23:44:04 2005 Jonathan Stanton <[email protected]>
+
+ * sp.c (SP_internal_multicast): Check for short writes on network
+ socket sends and loop to finish full write. Bug reported by Tudor Dumitras.
+
Thu Dec 02 23:50:27 2004 Ryan Caudy <[email protected]>
* groups.c (G_build_groups_buf): Fix groups-state-exchange
1.16 +14 -7 spread/daemon/sp.c
Index: sp.c
===================================================================
RCS file: /storage/cvsroot/spread/daemon/sp.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- sp.c 29 Oct 2004 21:13:07 -0000 1.15
+++ sp.c 7 Apr 2005 04:00:57 -0000 1.16
@@ -975,6 +975,7 @@
int mess_len, len;
int ses;
int i;
+ int buf_len;
int ret;
/* zero head_buf to avoid information leakage */
@@ -1019,19 +1020,24 @@
memcpy( group_ptr, groups, MAX_GROUP_NAME * num_groups );
Mutex_lock( &Mbox_mutex[mbox&MAX_MUTEX_MASK][0] );
- while(((ret=send( mbox, head_buf, sizeof(message_header)+MAX_GROUP_NAME*num_groups, 0 )) == -1)
- && ((sock_errno == EINTR) || (sock_errno == EAGAIN) || (sock_errno == EWOULDBLOCK)) )
+ for ( buf_len = 0; buf_len < sizeof(message_header)+MAX_GROUP_NAME*num_groups; buf_len += ret)
+ {
+ while(((ret=send( mbox, &head_buf[buf_len], sizeof(message_header)+MAX_GROUP_NAME*num_groups - buf_len, 0 )) == -1)
+ && ((sock_errno == EINTR) || (sock_errno == EAGAIN) || (sock_errno == EWOULDBLOCK)) )
;
- if( ret <=0 )
- {
+ if( ret <=0 )
+ {
Alarm( SESSION, "SP_internal_multicast: error %d sending header and groups on mailbox %d: %s \n", ret, mbox, sock_strerror(sock_errno));
Mutex_unlock( &Mbox_mutex[mbox&MAX_MUTEX_MASK][0] );
SP_kill( mbox );
return( CONNECTION_CLOSED );
- }
- for( len=0, i=0; i < scat_mess->num_elements; len+=ret, i++ )
+ }
+ }
+ for( len=0, i=0; i < scat_mess->num_elements; len+=buf_len, i++ )
{
- while(((ret=send( mbox, scat_mess->elements[i].buf, scat_mess->elements[i].len, 0 )) == -1)
+ for ( buf_len = 0; buf_len < scat_mess->elements[i].len; buf_len += ret)
+ {
+ while(((ret=send( mbox, &scat_mess->elements[i].buf[buf_len], scat_mess->elements[i].len - buf_len, 0 )) == -1)
&& ((sock_errno == EINTR) || (sock_errno == EAGAIN) || (sock_errno == EWOULDBLOCK)) )
;
if( ret < 0 )
@@ -1041,6 +1047,7 @@
SP_kill( mbox );
return( CONNECTION_CLOSED );
}
+ }
}
Mutex_unlock( &Mbox_mutex[mbox&MAX_MUTEX_MASK][0] );
return( len );
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.