if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */
struct in6_rtmsg32 __user *ur6 = argp;
- ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst),
- 3 * sizeof(struct in6_addr));
+ ret = copy_from_user((u8 *)&r6 + offsetof(typeof(r6), rtmsg_dst),
+ (u8 *)ur6 + offsetof(typeof(*ur6), rtmsg_dst),
+ 3 * sizeof(r6.rtmsg_dst));
ret |= get_user(r6.rtmsg_type, &(ur6->rtmsg_type));
ret |= get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len));
ret |= get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len));
r = (void *) &r6;
} else { /* ipv4 */
struct rtentry32 __user *ur4 = argp;
- ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst),
- 3 * sizeof(struct sockaddr));
+ ret = copy_from_user((u8 *)&r4 + offsetof(typeof(r4), rt_dst),
+ (u8 *)ur4 + offsetof(typeof(*ur4), rt_dst),
+ 3 * sizeof(r4.rt_dst));
ret |= get_user(r4.rt_flags, &(ur4->rt_flags));
ret |= get_user(r4.rt_metric, &(ur4->rt_metric));
ret |= get_user(r4.rt_mtu, &(ur4->rt_mtu));