diff options
author | iphydf <iphydf@users.noreply.github.com> | 2020-03-05 16:20:17 +0000 |
---|---|---|
committer | iphydf <iphydf@users.noreply.github.com> | 2020-03-06 11:05:52 +0000 |
commit | 7b3d2eda3f8b4bc221215875a3d813654e044a55 (patch) | |
tree | d105366207b29b926c6b526d9cb434d7246b3a37 | |
parent | 7923a619597cc9a4e62db65b0f8400176a78dfa3 (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.c | 26 | ||||
-rw-r--r-- | toxcore/LAN_discovery.c | 2 | ||||
-rw-r--r-- | toxcore/network.c | 12 |
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; |