Skip to content

Commit 7949789

Browse files
rlubosdanieldegrasse
authored andcommitted
net: ip: utils: Avoid casting to in(6)_addr struct in net_addr_ntop()
In order to avoid alignment issues when casting void pointers to in(6)_addr structures, create a properly aligned copy of the ip(v6) address on stack. Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
1 parent bd96b5d commit 7949789

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

subsys/net/ip/utils.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ static int net_value_to_udec(char *buf, uint32_t value, int precision)
160160
char *z_impl_net_addr_ntop(sa_family_t family, const void *src,
161161
char *dst, size_t size)
162162
{
163-
struct in_addr *addr = NULL;
164-
struct in6_addr *addr6 = NULL;
163+
struct in_addr addr = { 0 };
164+
struct in6_addr addr6 = { 0 };
165165
uint16_t *w = NULL;
166166
int i;
167167
uint8_t longest = 1U;
@@ -175,17 +175,17 @@ char *z_impl_net_addr_ntop(sa_family_t family, const void *src,
175175
bool mapped = false;
176176

177177
if (family == AF_INET6) {
178-
addr6 = (struct in6_addr *)src;
179-
w = (uint16_t *)addr6->s6_addr16;
178+
net_ipv6_addr_copy_raw(addr6.s6_addr, src);
179+
w = (uint16_t *)addr6.s6_addr16;
180180
len = 8;
181181

182-
if (net_ipv6_addr_is_v4_mapped(addr6)) {
182+
if (net_ipv6_addr_is_v4_mapped(&addr6)) {
183183
mapped = true;
184184
}
185185

186186
for (i = 0; i < 8; i++) {
187187
for (int j = i; j < 8; j++) {
188-
if (UNALIGNED_GET(&w[j]) != 0) {
188+
if (w[j] != 0) {
189189
break;
190190
}
191191

@@ -205,7 +205,7 @@ char *z_impl_net_addr_ntop(sa_family_t family, const void *src,
205205
}
206206

207207
} else if (family == AF_INET) {
208-
addr = (struct in_addr *)src;
208+
net_ipv4_addr_copy_raw(addr.s4_addr, src);
209209
len = 4;
210210
delim = '.';
211211
} else {
@@ -218,7 +218,7 @@ char *z_impl_net_addr_ntop(sa_family_t family, const void *src,
218218
if (len == 4) {
219219
uint8_t l;
220220

221-
value = (uint16_t)addr->s4_addr[i];
221+
value = (uint16_t)addr.s4_addr[i];
222222

223223
/* net_byte_to_udec() eats 0 */
224224
if (value == 0U) {
@@ -238,7 +238,7 @@ char *z_impl_net_addr_ntop(sa_family_t family, const void *src,
238238
if (mapped && (i > 5)) {
239239
delim = '.';
240240
len = 4;
241-
addr = (struct in_addr *)(&addr6->s6_addr32[3]);
241+
addr.s_addr = addr6.s6_addr32[3];
242242
*ptr++ = ':';
243243
family = AF_INET;
244244
goto print_mapped;

0 commit comments

Comments
 (0)