summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriphydf <iphydf@users.noreply.github.com>2020-03-05 16:20:17 +0000
committeriphydf <iphydf@users.noreply.github.com>2020-03-06 11:05:52 +0000
commit7b3d2eda3f8b4bc221215875a3d813654e044a55 (patch)
treed105366207b29b926c6b526d9cb434d7246b3a37
parent7923a619597cc9a4e62db65b0f8400176a78dfa3 (diff)
Use `net_pack` instead of casting bytes to ints.
The current code violates the C standard and causes crashes on strict alignment architectures.
-rw-r--r--toxav/bwcontroller.c26
-rw-r--r--toxcore/LAN_discovery.c2
-rw-r--r--toxcore/network.c12
3 files changed, 25 insertions, 15 deletions
diff --git a/toxav/bwcontroller.c b/toxav/bwcontroller.c
index 238a44c8..113a228e 100644
--- a/toxav/bwcontroller.c
+++ b/toxav/bwcontroller.c
@@ -146,12 +146,16 @@ void send_update(BWController *bwc)
146 (void *)bwc, bwc->cycle.recv, bwc->cycle.lost, 146 (void *)bwc, bwc->cycle.recv, bwc->cycle.lost,
147 (((double) bwc->cycle.lost / (bwc->cycle.recv + bwc->cycle.lost)) * 100.0)); 147 (((double) bwc->cycle.lost / (bwc->cycle.recv + bwc->cycle.lost)) * 100.0));
148 uint8_t bwc_packet[sizeof(struct BWCMessage) + 1]; 148 uint8_t bwc_packet[sizeof(struct BWCMessage) + 1];
149 struct BWCMessage *msg = (struct BWCMessage *)(bwc_packet + 1); 149 size_t offset = 0;
150 bwc_packet[0] = BWC_PACKET_ID; // set packet ID
151 msg->lost = net_htonl(bwc->cycle.lost);
152 msg->recv = net_htonl(bwc->cycle.recv);
153 150
154 if (-1 == m_send_custom_lossy_packet(bwc->m, bwc->friend_number, bwc_packet, sizeof(bwc_packet))) { 151 bwc_packet[offset] = BWC_PACKET_ID; // set packet ID
152 ++offset;
153
154 offset += net_pack_u32(bwc_packet + offset, bwc->cycle.lost);
155 offset += net_pack_u32(bwc_packet + offset, bwc->cycle.recv);
156 assert(offset == sizeof(bwc_packet));
157
158 if (m_send_custom_lossy_packet(bwc->m, bwc->friend_number, bwc_packet, sizeof(bwc_packet)) == -1) {
155 const char *netstrerror = net_new_strerror(net_error()); 159 const char *netstrerror = net_new_strerror(net_error());
156 LOGGER_WARNING(bwc->m->log, "BWC send failed (len: %u)! std error: %s, net error %s", 160 LOGGER_WARNING(bwc->m->log, "BWC send failed (len: %u)! std error: %s, net error %s",
157 (unsigned)sizeof(bwc_packet), strerror(errno), netstrerror); 161 (unsigned)sizeof(bwc_packet), strerror(errno), netstrerror);
@@ -177,8 +181,8 @@ static int on_update(BWController *bwc, const struct BWCMessage *msg)
177 181
178 bwc->cycle.last_recv_timestamp = current_time_monotonic(bwc->m->mono_time); 182 bwc->cycle.last_recv_timestamp = current_time_monotonic(bwc->m->mono_time);
179 183
180 uint32_t recv = net_ntohl(msg->recv); 184 const uint32_t recv = msg->recv;
181 uint32_t lost = net_ntohl(msg->lost); 185 const uint32_t lost = msg->lost;
182 186
183 if (lost && bwc->mcb) { 187 if (lost && bwc->mcb) {
184 LOGGER_DEBUG(bwc->m->log, "recved: %u lost: %u percentage: %f %%", recv, lost, 188 LOGGER_DEBUG(bwc->m->log, "recved: %u lost: %u percentage: %f %%", recv, lost,
@@ -197,5 +201,11 @@ int bwc_handle_data(Messenger *m, uint32_t friendnumber, const uint8_t *data, ui
197 return -1; 201 return -1;
198 } 202 }
199 203
200 return on_update((BWController *)object, (const struct BWCMessage *)(data + 1)); 204 size_t offset = 1; // Ignore packet id.
205 struct BWCMessage msg;
206 offset += net_unpack_u32(data + offset, &msg.lost);
207 offset += net_unpack_u32(data + offset, &msg.recv);
208 assert(offset == length);
209
210 return on_update((BWController *)object, &msg);
201} 211}
diff --git a/toxcore/LAN_discovery.c b/toxcore/LAN_discovery.c
index 1137fc3d..e7bb77ea 100644
--- a/toxcore/LAN_discovery.c
+++ b/toxcore/LAN_discovery.c
@@ -186,7 +186,7 @@ static void fetch_broadcast_info(uint16_t port)
186 continue; 186 continue;
187 } 187 }
188 188
189 struct sockaddr_in *sock4 = (struct sockaddr_in *)&i_faces[i].ifr_broadaddr; 189 struct sockaddr_in *sock4 = (struct sockaddr_in *)(void *)&i_faces[i].ifr_broadaddr;
190 190
191 if (count >= MAX_INTERFACES) { 191 if (count >= MAX_INTERFACES) {
192 break; 192 break;
diff --git a/toxcore/network.c b/toxcore/network.c
index 5e5160d8..e2870fee 100644
--- a/toxcore/network.c
+++ b/toxcore/network.c
@@ -1207,12 +1207,12 @@ int addr_resolve(const char *address, IP *to, IP *extra)
1207 switch (walker->ai_family) { 1207 switch (walker->ai_family) {
1208 case AF_INET: 1208 case AF_INET:
1209 if (walker->ai_family == family) { /* AF_INET requested, done */ 1209 if (walker->ai_family == family) { /* AF_INET requested, done */
1210 struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr; 1210 struct sockaddr_in *addr = (struct sockaddr_in *)(void *)walker->ai_addr;
1211 get_ip4(&to->ip.v4, &addr->sin_addr); 1211 get_ip4(&to->ip.v4, &addr->sin_addr);
1212 result = TOX_ADDR_RESOLVE_INET; 1212 result = TOX_ADDR_RESOLVE_INET;
1213 done = 1; 1213 done = 1;
1214 } else if (!(result & TOX_ADDR_RESOLVE_INET)) { /* AF_UNSPEC requested, store away */ 1214 } else if (!(result & TOX_ADDR_RESOLVE_INET)) { /* AF_UNSPEC requested, store away */
1215 struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr; 1215 struct sockaddr_in *addr = (struct sockaddr_in *)(void *)walker->ai_addr;
1216 get_ip4(&ip4.ip.v4, &addr->sin_addr); 1216 get_ip4(&ip4.ip.v4, &addr->sin_addr);
1217 result |= TOX_ADDR_RESOLVE_INET; 1217 result |= TOX_ADDR_RESOLVE_INET;
1218 } 1218 }
@@ -1222,14 +1222,14 @@ int addr_resolve(const char *address, IP *to, IP *extra)
1222 case AF_INET6: 1222 case AF_INET6:
1223 if (walker->ai_family == family) { /* AF_INET6 requested, done */ 1223 if (walker->ai_family == family) { /* AF_INET6 requested, done */
1224 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) { 1224 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
1225 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr; 1225 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(void *)walker->ai_addr;
1226 get_ip6(&to->ip.v6, &addr->sin6_addr); 1226 get_ip6(&to->ip.v6, &addr->sin6_addr);
1227 result = TOX_ADDR_RESOLVE_INET6; 1227 result = TOX_ADDR_RESOLVE_INET6;
1228 done = 1; 1228 done = 1;
1229 } 1229 }
1230 } else if (!(result & TOX_ADDR_RESOLVE_INET6)) { /* AF_UNSPEC requested, store away */ 1230 } else if (!(result & TOX_ADDR_RESOLVE_INET6)) { /* AF_UNSPEC requested, store away */
1231 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) { 1231 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
1232 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr; 1232 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(void *)walker->ai_addr;
1233 get_ip6(&ip6.ip.v6, &addr->sin6_addr); 1233 get_ip6(&ip6.ip.v6, &addr->sin6_addr);
1234 result |= TOX_ADDR_RESOLVE_INET6; 1234 result |= TOX_ADDR_RESOLVE_INET6;
1235 } 1235 }
@@ -1344,10 +1344,10 @@ int32_t net_getipport(const char *node, IP_Port **res, int tox_type)
1344 } 1344 }
1345 1345
1346 if (cur->ai_family == AF_INET) { 1346 if (cur->ai_family == AF_INET) {
1347 struct sockaddr_in *addr = (struct sockaddr_in *)cur->ai_addr; 1347 struct sockaddr_in *addr = (struct sockaddr_in *)(void *)cur->ai_addr;
1348 memcpy(&ip_port->ip.ip.v4, &addr->sin_addr, sizeof(IP4)); 1348 memcpy(&ip_port->ip.ip.v4, &addr->sin_addr, sizeof(IP4));
1349 } else if (cur->ai_family == AF_INET6) { 1349 } else if (cur->ai_family == AF_INET6) {
1350 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)cur->ai_addr; 1350 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(void *)cur->ai_addr;
1351 memcpy(&ip_port->ip.ip.v6, &addr->sin6_addr, sizeof(IP6)); 1351 memcpy(&ip_port->ip.ip.v6, &addr->sin6_addr, sizeof(IP6));
1352 } else { 1352 } else {
1353 continue; 1353 continue;