Browse Source

SPARC64 mem alingment fixes

Mészáros Mihály 6 years ago
parent
commit
4f2c353588
3 changed files with 38 additions and 28 deletions
  1. 16 11
      src/apps/uclient/uclient.c
  2. 11 13
      src/client/ns_turn_ioaddr.c
  3. 11 4
      src/client/ns_turn_msg.c

+ 16 - 11
src/apps/uclient/uclient.c

@@ -672,14 +672,16 @@ static int client_read(app_ur_session *elem, int is_tcp_data, app_tcp_conn_info
 
 		uint16_t chnumber = 0;
 
-		const message_info *mi = NULL;
-
+		message_info mi;
+		ns_bzero(&mi, sizeof(message_info));
+		int miset=0;
 		size_t buffers = 1;
 
 		if(is_tcp_data) {
-		   if ((int)elem->in_buffer.len == clmessage_length) {
-		     mi = (message_info*)(elem->in_buffer.buf);
-		   }
+		  if ((int)elem->in_buffer.len == clmessage_length) {
+		    ns_bcopy((elem->in_buffer.buf), &mi, sizeof(message_info));
+		    miset=1;
+		  }
 		} else if (stun_is_indication(&(elem->in_buffer))) {
 
 			uint16_t method = stun_get_method(&elem->in_buffer);
@@ -726,7 +728,8 @@ static int client_read(app_ur_session *elem, int is_tcp_data, app_tcp_conn_info
 
 				const u08bits* data = stun_attr_get_value(sar);
 
-				mi = (const message_info*) data;
+				ns_bcopy(data, &mi, sizeof(message_info));
+				miset=1;
 			}
 
 		} else if (stun_is_success_response(&(elem->in_buffer))) {
@@ -781,7 +784,8 @@ static int client_read(app_ur_session *elem, int is_tcp_data, app_tcp_conn_info
 					return rc;
 				}
 
-				mi = (message_info*)(elem->in_buffer.buf + 4);
+				ns_bcopy(elem->in_buffer.buf + 4, &mi, sizeof(message_info));
+				miset=1;
 				applen = elem->in_buffer.len -4;
 			}
 		} else {
@@ -790,15 +794,16 @@ static int client_read(app_ur_session *elem, int is_tcp_data, app_tcp_conn_info
 			return rc;
 		}
 
-		if(mi) {
+		if(miset) {
 			/*
 			printf("%s: 111.111: msgnum=%d, rmsgnum=%d, sent=%lu, recv=%lu\n",__FUNCTION__,
 				mi->msgnum,elem->recvmsgnum,(unsigned long)mi->mstime,(unsigned long)current_mstime);
 				*/
-			if(mi->msgnum != elem->recvmsgnum+1)
+
+			if(mi.msgnum != elem->recvmsgnum+1)
 				++(elem->loss);
 			else {
-			  u64bits clatency = (u64bits)time_minus(current_mstime,mi->mstime);
+			  u64bits clatency = (u64bits)time_minus(current_mstime,mi.mstime);
 			  if(clatency>max_latency)
 			    max_latency = clatency;
 			  if(clatency<min_latency)
@@ -816,7 +821,7 @@ static int client_read(app_ur_session *elem, int is_tcp_data, app_tcp_conn_info
 			  }
 			}
 
-			elem->recvmsgnum = mi->msgnum;
+			elem->recvmsgnum = mi.msgnum;
 		}
 
 		elem->rmsgnum+=buffers;

+ 11 - 13
src/client/ns_turn_ioaddr.c

@@ -106,9 +106,10 @@ u32bits addr_hash(const ioa_addr *addr)
 	if (addr->ss.sa_family == AF_INET) {
 		ret = hash_int32(addr->s4.sin_addr.s_addr + addr->s4.sin_port);
 	} else {
-		const u64bits *a = (const u64bits *) (&(addr->s6.sin6_addr));
+		u64bits a[2];
+		ns_bcopy(&(addr->s6.sin6_addr), &a, sizeof(addr->s6.sin6_addr));
 		ret = (u32bits)((hash_int64(a[0])<<3) + (hash_int64(a[1] + addr->s6.sin6_port)));
-	}
+		}
 	return ret;
 }
 
@@ -121,7 +122,8 @@ u32bits addr_hash_no_port(const ioa_addr *addr)
 	if (addr->ss.sa_family == AF_INET) {
 		ret = hash_int32(addr->s4.sin_addr.s_addr);
 	} else {
-		const u64bits *a = (const u64bits *) (&(addr->s6.sin6_addr));
+		u64bits a[2];
+		ns_bcopy(&(addr->s6.sin6_addr), &a, sizeof(addr->s6.sin6_addr));
 		ret = (u32bits)((hash_int64(a[0])<<3) + (hash_int64(a[1])));
 	}
 	return ret;
@@ -153,10 +155,8 @@ int addr_eq(const ioa_addr* a1, const ioa_addr *a2) {
 	return 1;
       }
     } else if(a1->ss.sa_family == AF_INET6 && a1->s6.sin6_port == a2->s6.sin6_port) {
-      const u64bits *p1=(const u64bits *)(&(a1->s6.sin6_addr));
-      const u64bits *p2=(const u64bits *)(&(a2->s6.sin6_addr));
-      if(p1[0]==p2[0] && p1[1]==p2[1]) {
-	return 1;
+        if( memcmp(&(a1->s6.sin6_addr), &(a2->s6.sin6_addr) ,sizeof(struct in6_addr)) == 0 ) {
+        return 1;
       }
     }
   }
@@ -172,14 +172,12 @@ int addr_eq_no_port(const ioa_addr* a1, const ioa_addr *a2) {
   if(a1->ss.sa_family == a2->ss.sa_family) {
     if(a1->ss.sa_family == AF_INET) {
       if((int)a1->s4.sin_addr.s_addr == (int)a2->s4.sin_addr.s_addr) {
-	return 1;
+        return 1;
       }
     } else if(a1->ss.sa_family == AF_INET6) {
-	const u64bits *p1=(const u64bits *)(&(a1->s6.sin6_addr));
-	const u64bits *p2=(const u64bits *)(&(a2->s6.sin6_addr));
-	if(p1[0]==p2[0] && p1[1]==p2[1]) {
-	  return 1;
-	}
+      if( memcmp(&(a1->s6.sin6_addr), &(a2->s6.sin6_addr) ,sizeof(struct in6_addr)) == 0 ) {
+        return 1;
+      }
     }
   }
   return 0;

+ 11 - 4
src/client/ns_turn_msg.c

@@ -1296,7 +1296,9 @@ u64bits stun_attr_get_reservation_token_value(stun_attr_ref attr)  {
   if(attr) {
     const u08bits* value = stun_attr_get_value(attr);
     if(value && (stun_attr_get_len(attr) == 8)) {
-      return nswap64(((const u64bits*)value)[0]);
+      u64bits token;
+      ns_bcopy(value, &token, sizeof(u64bits));
+      return nswap64(token);
     }
   }
   return 0;
@@ -2432,7 +2434,8 @@ static int encode_oauth_token_gcm(const u08bits *server_name, encoded_oauth_toke
 		ns_bcopy(dtoken->enc_block.mac_key,orig_field+len,dtoken->enc_block.key_length);
 		len += dtoken->enc_block.key_length;
 
-		*((uint64_t*)(orig_field+len)) = nswap64(dtoken->enc_block.timestamp);
+		uint64_t ts = nswap64(dtoken->enc_block.timestamp);
+		ns_bcopy( &ts, (orig_field+len), 8);
 		len += 8;
 
 		*((uint32_t*)(orig_field+len)) = nswap32(dtoken->enc_block.lifetime);
@@ -2608,10 +2611,14 @@ static int decode_oauth_token_gcm(const u08bits *server_name, const encoded_oaut
 		ns_bcopy(decoded_field+len,dtoken->enc_block.mac_key,dtoken->enc_block.key_length);
 		len += dtoken->enc_block.key_length;
 
-		dtoken->enc_block.timestamp = nswap64(*((uint64_t*)(decoded_field+len)));
+		uint64_t ts;
+		ns_bcopy((decoded_field+len),&ts,8);
+		dtoken->enc_block.timestamp = nswap64(ts);
 		len += 8;
 
-		dtoken->enc_block.lifetime = nswap32(*((uint32_t*)(decoded_field+len)));
+		uint32_t lt;
+		ns_bcopy((decoded_field+len),&lt,4);
+		dtoken->enc_block.lifetime = nswap32(lt);
 		len += 4;
 
 		return 0;