jonathan 05/04/01 08:21:34
Modified: daemon Tag: branch_3_17 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
No revision
No revision
1.4.2.3 +6 -0 spread/daemon/Changelog
Index: Changelog
===================================================================
RCS file: /storage/cvsroot/spread/daemon/Changelog,v
retrieving revision 1.4.2.2
retrieving revision 1.4.2.3
diff -u -r1.4.2.2 -r1.4.2.3
--- Changelog 29 Oct 2004 17:35:56 -0000 1.4.2.2
+++ Changelog 1 Apr 2005 13:21:34 -0000 1.4.2.3
@@ -1,3 +1,9 @@
+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.
+
Fri Oct 29 13:24:53 2004 Jonathan Stanton <[email protected]>
* monitor.c (main): Move WSAStartup before Conf_init. Reported
1.14.2.1 +14 -7 spread/daemon/sp.c
Index: sp.c
===================================================================
RCS file: /storage/cvsroot/spread/daemon/sp.c,v
retrieving revision 1.14
retrieving revision 1.14.2.1
diff -u -r1.14 -r1.14.2.1
--- sp.c 5 Oct 2004 14:08:10 -0000 1.14
+++ sp.c 1 Apr 2005 13:21:34 -0000 1.14.2.1
@@ -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.