cvs commit: spread/daemon Changelog sp.c

[email protected]
Newsgroups gmane.network.spread.cvs
Message-ID <[email protected]>
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.