diff --git a/src/apps/uclient/uclient.c b/src/apps/uclient/uclient.c index ecd61bdf..0ca87598 100644 --- a/src/apps/uclient/uclient.c +++ b/src/apps/uclient/uclient.c @@ -672,13 +672,14 @@ 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; + 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); + ns_bcopy((elem->in_buffer.buf), &mi, sizeof(message_info)); + miset=1; } } else if (stun_is_indication(&(elem->in_buffer))) { @@ -726,7 +727,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 +783,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 +793,15 @@ 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(clatencyrecvmsgnum = mi->msgnum; + elem->recvmsgnum = mi.msgnum; } elem->rmsgnum+=buffers; diff --git a/src/client/ns_turn_ioaddr.c b/src/client/ns_turn_ioaddr.c index 138de18c..b4948a01 100644 --- a/src/client/ns_turn_ioaddr.c +++ b/src/client/ns_turn_ioaddr.c @@ -106,7 +106,8 @@ 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(a)); 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(a)); 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; } } } @@ -175,11 +175,9 @@ int addr_eq_no_port(const ioa_addr* a1, const ioa_addr *a2) { 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; diff --git a/src/client/ns_turn_msg.c b/src/client/ns_turn_msg.c index 037fdc47..03cff34f 100644 --- a/src/client/ns_turn_msg.c +++ b/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,8 +2434,9 @@ 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); - len += 8; + uint64_t ts = nswap64(dtoken->enc_block.timestamp); + ns_bcopy( &ts, (orig_field+len), sizeof(ts)); + len += sizeof(ts); *((uint32_t*)(orig_field+len)) = nswap32(dtoken->enc_block.lifetime); len += 4; @@ -2608,11 +2611,15 @@ 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))); - len += 8; + uint64_t ts; + ns_bcopy((decoded_field+len),&ts,sizeof(ts)); + dtoken->enc_block.timestamp = nswap64(ts); + len += sizeof(ts); - dtoken->enc_block.lifetime = nswap32(*((uint32_t*)(decoded_field+len))); - len += 4; + uint32_t lt; + ns_bcopy((decoded_field+len),<,sizeof(lt)); + dtoken->enc_block.lifetime = nswap32(lt); + len += sizeof(lt); return 0; }