[Spread-cvs] cvs commit: spread/daemon Readme.txt groups.c

jonathan at spread.org jonathan at spread.org
Sun Jan 25 18:03:17 EST 2004


jonathan    04/01/25 18:03:17

  Modified:    daemon   Readme.txt groups.c
  Log:
  Fix bus errors on Sparc and Alpha where non-word aligned int pointer was
  assigned to. Instead use a correctly aligned integer and memcpy to the
  pointer when needed. Reported by Greb Shebert and Mikhail Terekhov.
  
  Revision  Changes    Path
  1.41      +2 -0      spread/daemon/Readme.txt
  
  Index: Readme.txt
  ===================================================================
  RCS file: /storage/cvsroot/spread/daemon/Readme.txt,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- Readme.txt	25 Jan 2004 20:27:52 -0000	1.40
  +++ Readme.txt	25 Jan 2004 23:03:17 -0000	1.41
  @@ -62,6 +62,8 @@
   *) Alarm() changes to support priority levels on each Alarm() call. 
   *) Fix crash by improving packet accounting when a client connected to a 
      singleton daemon sends a large broadcast. Reported by David Shaw.
  +*) Fix bus errors on Sparc & Alpha for message buffer integer assignment. 
  +   Reported by Greg Shebert and Mikhail Terekhov. 
   
   June 20, 2003 Ver 3.17.1
   ----------------------------
  
  
  
  1.12      +29 -15    spread/daemon/groups.c
  
  Index: groups.c
  ===================================================================
  RCS file: /storage/cvsroot/spread/daemon/groups.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- groups.c	24 Oct 2003 21:47:37 -0000	1.11
  +++ groups.c	25 Jan 2004 23:03:17 -0000	1.12
  @@ -826,7 +826,8 @@
   					/* notify all local members */
   					num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
   					num_bytes += sizeof( int32 );
  -					*num_vs_ptr = 1;
  +                                        temp = 1;
  +                                        memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
   
   					vs_ptr = (char *)&Mess_buf[ num_bytes ];
   					memcpy( vs_ptr, new_mbr->private_name, MAX_GROUP_NAME );
  @@ -893,7 +894,8 @@
   						/* build a self vs set */
   						num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
   						num_bytes += sizeof( int32 );
  -						*num_vs_ptr = 1;
  +                                                temp = 1;
  +                                                memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
   						vs_ptr = (char *)&Mess_buf[ num_bytes ];
   						memcpy( vs_ptr, new_mbr->private_name, MAX_GROUP_NAME );
   						num_bytes += MAX_GROUP_NAME;
  @@ -1147,7 +1149,8 @@
   			/* notify all local members */
   			num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
   			num_bytes += sizeof( int32 );
  -			*num_vs_ptr = 1;
  +                        temp = 1;
  +                        memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
   
   			vs_ptr = (char *)&Mess_buf[ num_bytes ];
   		        memcpy( vs_ptr, departing_private_group_name, MAX_GROUP_NAME );
  @@ -1340,7 +1343,8 @@
   
   				num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
   				num_bytes += sizeof( int32 );
  -				*num_vs_ptr = 1;
  +                                temp = 1;
  +                                memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
   
   				vs_ptr = (char *)&Mess_buf[ num_bytes ];
   				memcpy( vs_ptr, departing_private_group_name, MAX_GROUP_NAME );
  @@ -1481,6 +1485,7 @@
   	int		ret;
   	int		vs_bytes;
   	int32		*num_vs_ptr; /* num members in virtual-synchrony/failure-atomicity set */
  +        int32           num_vs;
   	int		num_exist;
   	struct worklist *indices[MAX_PROCS_RING];
   	int		num_bytes;
  @@ -1541,7 +1546,7 @@
   	    vs_bytes = 0;
   	    num_vs_ptr = (int32 *)&Temp_buf[0];
   	    vs_bytes+= sizeof( int32 );
  -	    *num_vs_ptr = 0;
  +            num_vs = 0;
   	    
   	    changed = 0;
   	    orig_grp = NULL;
  @@ -1592,7 +1597,7 @@
                                           /* add this non-new member to vs */
                                           memcpy( &Temp_buf[vs_bytes], mbr->private_name, MAX_GROUP_NAME );
                                           vs_bytes += MAX_GROUP_NAME;
  -                                        (*num_vs_ptr)++;	
  +                                        num_vs++;	
                             }
                     }else{
   			  /* not the same grp_id */
  @@ -1609,6 +1614,8 @@
   		  sl_remove(indices[i]->groups, currentgroup, dispose);
               }
   
  +            memcpy( num_vs_ptr, &num_vs, sizeof( int32 ) ); /* *num_vs_ptr = current count; */
  +
               /* now our orig_grp is almost updated */
               grp = orig_grp;
               
  @@ -1856,6 +1863,7 @@
   	struct skiplistnode *iter;
           member          *mbr;
   	char		*membs_ptr;
  +        int32           num_vs;
   
   	num_bytes = G_build_memb_buf( grp, msg, buf);
   	head_ptr = Message_get_message_header(msg);
  @@ -1865,7 +1873,7 @@
   	num_vs_ptr = (int32 *)&buf[num_bytes];
   	num_bytes += sizeof( int32 );
           head_ptr->data_len += sizeof( int32 );
  -	*num_vs_ptr = 0;
  +        num_vs = 0;
   
           iter = sl_getlist( &grp->MembersList );
   	mbr = (iter)?(member *)iter->data:NULL;
  @@ -1875,11 +1883,12 @@
   		{
   			membs_ptr = (char *)&buf[num_bytes];
   			memcpy( membs_ptr, mbr->private_name, MAX_GROUP_NAME );
  -			(*num_vs_ptr)++ ;
  +			num_vs++ ;
   			num_bytes += MAX_GROUP_NAME;
   			head_ptr->data_len += MAX_GROUP_NAME;
   		}
   	}
  +        memcpy( num_vs_ptr, &num_vs, sizeof( int32 ) ); /* *num_vs_ptr = total count; */
   
   	return( num_bytes );
   }
  @@ -1917,6 +1926,7 @@
   	member		*mbr;
   	struct skiplistnode *giter, *iter;
   	int16		*num_memb_ptr;
  +        int16           num_memb;
   	char		*memb_ptr;
           int     size_for_this_group;
   
  @@ -1947,7 +1957,7 @@
   
   		num_memb_ptr = (int16 *)&buf[num_bytes];
   		num_bytes += sizeof( int16 );
  -		*num_memb_ptr  = 0;
  +		num_memb  = 0;
   
   		iter = sl_getlist( &grp->MembersList );
   		mbr = (iter)?(member *)iter->data:NULL;
  @@ -1958,13 +1968,14 @@
   			memb_ptr = (char *)&buf[num_bytes];
   			num_bytes += MAX_GROUP_NAME;
   			memcpy( memb_ptr, mbr->private_name, MAX_GROUP_NAME );
  -			(*num_memb_ptr)++;
  +			num_memb++;
   		}
  -                if( (*num_memb_ptr) != grp->num_local )
  +                if( num_memb != grp->num_local )
                           Alarm( EXIT, "G_build_groups_buf: group %s has %d %d members\n",
  -                               grp->name, (*num_memb_ptr), grp->num_local );
  +                               grp->name, num_memb, grp->num_local );
                   
           }
  +        memcpy(num_memb_ptr, &num_memb, sizeof( int16 ) );
           *iter_ptr = giter; 
   	return( num_bytes );
   }
  @@ -1982,6 +1993,7 @@
   	char		*gid_ptr;
   	member		*mbr;
   	int16		*num_memb_ptr;
  +        int16           num_memb;
   	int		i;
   
   	total_bytes = 0;
  @@ -2031,6 +2043,7 @@
   
   		num_memb_ptr = (int16 *)&Temp_buf[num_bytes];
   		num_bytes += sizeof( int16 );
  +                memcpy( &num_memb, num_memb_ptr, sizeof( int16 ) );
   
   		if( !Same_endian( head_ptr->type ) )
   		{
  @@ -2040,10 +2053,10 @@
   			grp->grp_id.index    	    = Flip_int32( grp->grp_id.index );
   
   			/* flip other parts of the message */
  -			*num_memb_ptr  = Flip_int16( *num_memb_ptr  );
  +			num_memb  = Flip_int16( num_memb  );
   		}
   		/* creating members */
  -		for( i=0; i < *num_memb_ptr; i++ )
  +		for( i=0; i < num_memb; i++ )
   		{
   			mbr = new( MEMBER );
   			
  @@ -2055,7 +2068,8 @@
   			sl_append( &grp->MembersList, mbr );
   		}
   
  -		grp->num_members = *num_memb_ptr;
  +		grp->num_members = num_memb;
  +                memcpy( num_memb_ptr, &num_memb, sizeof( int16 ) );
   	}
   	return( 0 );
   }
  
  
  




More information about the Spread-cvs mailing list