diff options
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r-- | net/packet/af_packet.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 4040eb92d9c9..9bff6ef16fa7 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -93,6 +93,7 @@ | |||
93 | #include <net/inet_common.h> | 93 | #include <net/inet_common.h> |
94 | #endif | 94 | #endif |
95 | #include <linux/bpf.h> | 95 | #include <linux/bpf.h> |
96 | #include <net/compat.h> | ||
96 | 97 | ||
97 | #include "internal.h" | 98 | #include "internal.h" |
98 | 99 | ||
@@ -3940,6 +3941,27 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, | |||
3940 | } | 3941 | } |
3941 | 3942 | ||
3942 | 3943 | ||
3944 | #ifdef CONFIG_COMPAT | ||
3945 | static int compat_packet_setsockopt(struct socket *sock, int level, int optname, | ||
3946 | char __user *optval, unsigned int optlen) | ||
3947 | { | ||
3948 | struct packet_sock *po = pkt_sk(sock->sk); | ||
3949 | |||
3950 | if (level != SOL_PACKET) | ||
3951 | return -ENOPROTOOPT; | ||
3952 | |||
3953 | if (optname == PACKET_FANOUT_DATA && | ||
3954 | po->fanout && po->fanout->type == PACKET_FANOUT_CBPF) { | ||
3955 | optval = (char __user *)get_compat_bpf_fprog(optval); | ||
3956 | if (!optval) | ||
3957 | return -EFAULT; | ||
3958 | optlen = sizeof(struct sock_fprog); | ||
3959 | } | ||
3960 | |||
3961 | return packet_setsockopt(sock, level, optname, optval, optlen); | ||
3962 | } | ||
3963 | #endif | ||
3964 | |||
3943 | static int packet_notifier(struct notifier_block *this, | 3965 | static int packet_notifier(struct notifier_block *this, |
3944 | unsigned long msg, void *ptr) | 3966 | unsigned long msg, void *ptr) |
3945 | { | 3967 | { |
@@ -4416,6 +4438,9 @@ static const struct proto_ops packet_ops = { | |||
4416 | .shutdown = sock_no_shutdown, | 4438 | .shutdown = sock_no_shutdown, |
4417 | .setsockopt = packet_setsockopt, | 4439 | .setsockopt = packet_setsockopt, |
4418 | .getsockopt = packet_getsockopt, | 4440 | .getsockopt = packet_getsockopt, |
4441 | #ifdef CONFIG_COMPAT | ||
4442 | .compat_setsockopt = compat_packet_setsockopt, | ||
4443 | #endif | ||
4419 | .sendmsg = packet_sendmsg, | 4444 | .sendmsg = packet_sendmsg, |
4420 | .recvmsg = packet_recvmsg, | 4445 | .recvmsg = packet_recvmsg, |
4421 | .mmap = packet_mmap, | 4446 | .mmap = packet_mmap, |