diff options
author | Steffen Hurrle <steffen@hurrle.net> | 2014-01-17 16:53:15 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-19 02:04:16 -0500 |
commit | 342dfc306fb32155314dad277f3c3686b83fb9f1 (patch) | |
tree | a0d220f9310725c72bac70945261c9282e7cf305 /net/packet/af_packet.c | |
parent | ea02f9411d9faa3553ed09ce0ec9f00ceae9885e (diff) |
net: add build-time checks for msg->msg_name size
This is a follow-up patch to f3d3342602f8bc ("net: rework recvmsg
handler msg_name and msg_namelen logic").
DECLARE_SOCKADDR validates that the structure we use for writing the
name information to is not larger than the buffer which is reserved
for msg->msg_name (which is 128 bytes). Also use DECLARE_SOCKADDR
consistently in sendmsg code paths.
Signed-off-by: Steffen Hurrle <steffen@hurrle.net>
Suggested-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r-- | net/packet/af_packet.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 12f2f725a945..d711ecbbb9d3 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -1584,7 +1584,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock, | |||
1584 | struct msghdr *msg, size_t len) | 1584 | struct msghdr *msg, size_t len) |
1585 | { | 1585 | { |
1586 | struct sock *sk = sock->sk; | 1586 | struct sock *sk = sock->sk; |
1587 | struct sockaddr_pkt *saddr = (struct sockaddr_pkt *)msg->msg_name; | 1587 | DECLARE_SOCKADDR(struct sockaddr_pkt *, saddr, msg->msg_name); |
1588 | struct sk_buff *skb = NULL; | 1588 | struct sk_buff *skb = NULL; |
1589 | struct net_device *dev; | 1589 | struct net_device *dev; |
1590 | __be16 proto = 0; | 1590 | __be16 proto = 0; |
@@ -2196,7 +2196,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2196 | __be16 proto; | 2196 | __be16 proto; |
2197 | int err, reserve = 0; | 2197 | int err, reserve = 0; |
2198 | void *ph; | 2198 | void *ph; |
2199 | struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name; | 2199 | DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); |
2200 | bool need_wait = !(msg->msg_flags & MSG_DONTWAIT); | 2200 | bool need_wait = !(msg->msg_flags & MSG_DONTWAIT); |
2201 | int tp_len, size_max; | 2201 | int tp_len, size_max; |
2202 | unsigned char *addr; | 2202 | unsigned char *addr; |
@@ -2346,7 +2346,7 @@ static struct sk_buff *packet_alloc_skb(struct sock *sk, size_t prepad, | |||
2346 | static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | 2346 | static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) |
2347 | { | 2347 | { |
2348 | struct sock *sk = sock->sk; | 2348 | struct sock *sk = sock->sk; |
2349 | struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name; | 2349 | DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); |
2350 | struct sk_buff *skb; | 2350 | struct sk_buff *skb; |
2351 | struct net_device *dev; | 2351 | struct net_device *dev; |
2352 | __be16 proto; | 2352 | __be16 proto; |
@@ -2922,6 +2922,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
2922 | * in, we fill it in now. | 2922 | * in, we fill it in now. |
2923 | */ | 2923 | */ |
2924 | if (sock->type == SOCK_PACKET) { | 2924 | if (sock->type == SOCK_PACKET) { |
2925 | __sockaddr_check_size(sizeof(struct sockaddr_pkt)); | ||
2925 | msg->msg_namelen = sizeof(struct sockaddr_pkt); | 2926 | msg->msg_namelen = sizeof(struct sockaddr_pkt); |
2926 | } else { | 2927 | } else { |
2927 | struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; | 2928 | struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; |