projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
b7a3140
)
seccomp: fix memory leak on filter attach
author
Kees Cook
<
[email protected]
>
Wed, 16 Apr 2014 17:54:34 +0000
(10:54 -0700)
committer
David S. Miller
<
[email protected]
>
Wed, 16 Apr 2014 19:25:53 +0000
(15:25 -0400)
This sets the correct error code when final filter memory is unavailable,
and frees the raw filter no matter what.
unreferenced object 0xffff8800d6ea4000 (size 512):
comm "sshd", pid 278, jiffies
4294898315
(age 46.653s)
hex dump (first 32 bytes):
21 00 00 00 04 00 00 00 15 00 01 00 3e 00 00 c0 !...........>...
06 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!.......
backtrace:
[<
ffffffff8151414e
>] kmemleak_alloc+0x4e/0xb0
[<
ffffffff811a3a40
>] __kmalloc+0x280/0x320
[<
ffffffff8110842e
>] prctl_set_seccomp+0x11e/0x3b0
[<
ffffffff8107bb6b
>] SyS_prctl+0x3bb/0x4a0
[<
ffffffff8152ef2d
>] system_call_fastpath+0x1a/0x1f
[<
ffffffffffffffff
>] 0xffffffffffffffff
Reported-by: Masami Ichikawa <
[email protected]
>
Signed-off-by: Kees Cook <
[email protected]
>
Tested-by: Masami Ichikawa <
[email protected]
>
Acked-by: Daniel Borkmann <
[email protected]
>
Signed-off-by: David S. Miller <
[email protected]
>
kernel/seccomp.c
patch
|
blob
|
history
diff --git
a/kernel/seccomp.c
b/kernel/seccomp.c
index 590c37925084d08e046e6f51de58a4845b7d5f72..b35c21503a36d6e63160f7f46a2eb7bf59d371ce 100644
(file)
--- a/
kernel/seccomp.c
+++ b/
kernel/seccomp.c
@@
-255,6
+255,7
@@
static long seccomp_attach_filter(struct sock_fprog *fprog)
goto free_prog;
/* Allocate a new seccomp_filter */
+ ret = -ENOMEM;
filter = kzalloc(sizeof(struct seccomp_filter) +
sizeof(struct sock_filter_int) * new_len,
GFP_KERNEL|__GFP_NOWARN);
@@
-264,6
+265,7
@@
static long seccomp_attach_filter(struct sock_fprog *fprog)
ret = sk_convert_filter(fp, fprog->len, filter->insnsi, &new_len);
if (ret)
goto free_filter;
+ kfree(fp);
atomic_set(&filter->usage, 1);
filter->len = new_len;