On Friday 25 January 2013 09:48, Joerg Epping wrote:
> Hello,
>
> on ARM9 machines ping6 still segfaults sometimes. I tracked this down
> to the unpack6/inet_ntop function. I think it's memory alignment
> again.
> Below there is my patch to solve this issue (only tested on ARM9).
This is strange. unpack6() is called on stack-allocated
struct sockaddr_in6 here:
static void ping6(len_and_sockaddr *lsa)
{
int sockopt;
struct msghdr msg;
struct sockaddr_in6 from;
....
unpack6(G.rcv_packet, c, &from, hoplimit);
and you are saying that then, when "from" is fed to this:
inet_ntop(AF_INET6, &from->sin6_addr,
buf, sizeof(buf)),
it segfaults.
But from->sin6_addr is well-aligned within the structure:
struct sockaddr_in6 {
uint16_t sin6_family;
uint16_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
You are merely moving it just to another stack variable:
> + struct in6_addr target;
>
> if (sz >= sizeof(struct icmp6_hdr) + sizeof(uint32_t))
> tp = (uint32_t *) &icmppkt->icmp6_data8[4];
> + memcpy(&target, &from->sin6_addr, sizeof(struct in6_addr));
> unpack_tail(sz, tp,
> - inet_ntop(AF_INET6, &from->sin6_addr,
> + inet_ntop(AF_INET6, &target,
Can you experiment with printing &from->sin6_addr a-la
bb_error_msg("from:%p &from->sin6_addr:%p", from, &from->sin6_addr);
?
--
vda
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox