summaryrefslogtreecommitdiffstats
path: root/net/core/filter.c
diff options
context:
space:
mode:
authorTetsuo Handa2019-04-12 12:55:47 +0200
committerDavid S. Miller2019-04-12 19:25:03 +0200
commitba024f2574a19557f92116ec6be129b26ae66e97 (patch)
tree477971c04d8cc2ee30b7f8a1e94ecffd709232cd /net/core/filter.c
parentllc: Check address length before reading address field (diff)
downloadkernel-qcow2-linux-ba024f2574a19557f92116ec6be129b26ae66e97.tar.gz
kernel-qcow2-linux-ba024f2574a19557f92116ec6be129b26ae66e97.tar.xz
kernel-qcow2-linux-ba024f2574a19557f92116ec6be129b26ae66e97.zip
bpf: Check address length before reading address family
KMSAN will complain if valid address length passed to bpf_bind() is shorter than sizeof("struct sockaddr"->sa_family) bytes. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Acked-by: Andrey Ignatov <rdna@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/filter.c')
-rw-r--r--net/core/filter.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/core/filter.c b/net/core/filter.c
index fc92ebc4e200..27e61ffd9039 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -4383,6 +4383,8 @@ BPF_CALL_3(bpf_bind, struct bpf_sock_addr_kern *, ctx, struct sockaddr *, addr,
* Only binding to IP is supported.
*/
err = -EINVAL;
+ if (addr_len < offsetofend(struct sockaddr, sa_family))
+ return err;
if (addr->sa_family == AF_INET) {
if (addr_len < sizeof(struct sockaddr_in))
return err;