Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv6: Fix ipv6_getsockopt for IPV6_2292PKTOPTIONS

IPV6_2292PKTOPTIONS is broken for 32-bit applications running
in COMPAT mode on 64-bit kernels.

The same problem was fixed for IPv4 with the patch:
ipv4: Fix ip_getsockopt for IP_PKTOPTIONS,
commit dd23198e58cd35259dd09e8892bbdb90f1d57748

Signed-off-by: Sorin Dumitru <sdumitru@ixiacom.com>
Signed-off-by: Daniel Baluta <dbaluta@ixiacom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Daniel Baluta and committed by
David S. Miller
98e77438 2d5b2c5c

+5 -4
+5 -4
net/ipv6/ipv6_sockglue.c
··· 913 913 } 914 914 915 915 static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, 916 - char __user *optval, int __user *optlen) 916 + char __user *optval, int __user *optlen, unsigned flags) 917 917 { 918 918 struct ipv6_pinfo *np = inet6_sk(sk); 919 919 int len; ··· 962 962 963 963 msg.msg_control = optval; 964 964 msg.msg_controllen = len; 965 - msg.msg_flags = 0; 965 + msg.msg_flags = flags; 966 966 967 967 lock_sock(sk); 968 968 skb = np->pktoptions; ··· 1222 1222 if(level != SOL_IPV6) 1223 1223 return -ENOPROTOOPT; 1224 1224 1225 - err = do_ipv6_getsockopt(sk, level, optname, optval, optlen); 1225 + err = do_ipv6_getsockopt(sk, level, optname, optval, optlen, 0); 1226 1226 #ifdef CONFIG_NETFILTER 1227 1227 /* we need to exclude all possible ENOPROTOOPTs except default case */ 1228 1228 if (err == -ENOPROTOOPT && optname != IPV6_2292PKTOPTIONS) { ··· 1264 1264 return compat_mc_getsockopt(sk, level, optname, optval, optlen, 1265 1265 ipv6_getsockopt); 1266 1266 1267 - err = do_ipv6_getsockopt(sk, level, optname, optval, optlen); 1267 + err = do_ipv6_getsockopt(sk, level, optname, optval, optlen, 1268 + MSG_CMSG_COMPAT); 1268 1269 #ifdef CONFIG_NETFILTER 1269 1270 /* we need to exclude all possible ENOPROTOOPTs except default case */ 1270 1271 if (err == -ENOPROTOOPT && optname != IPV6_2292PKTOPTIONS) {