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:
b711c12
)
rds: limit the size allocated by rds_message_alloc()
author
Cong Wang
<
[email protected]
>
Sun, 3 Mar 2013 16:18:11 +0000
(16:18 +0000)
committer
David S. Miller
<
[email protected]
>
Mon, 4 Mar 2013 19:12:06 +0000
(14:12 -0500)
Dave Jones reported the following bug:
"When fed mangled socket data, rds will trust what userspace gives it,
and tries to allocate enormous amounts of memory larger than what
kmalloc can satisfy."
WARNING: at mm/page_alloc.c:2393 __alloc_pages_nodemask+0xa0d/0xbe0()
Hardware name: GA-MA78GM-S2H
Modules linked in: vmw_vsock_vmci_transport vmw_vmci vsock fuse bnep dlci bridge 8021q garp stp mrp binfmt_misc l2tp_ppp l2tp_core rfcomm s
Pid: 24652, comm: trinity-child2 Not tainted 3.8.0+ #65
Call Trace:
[<
ffffffff81044155
>] warn_slowpath_common+0x75/0xa0
[<
ffffffff8104419a
>] warn_slowpath_null+0x1a/0x20
[<
ffffffff811444ad
>] __alloc_pages_nodemask+0xa0d/0xbe0
[<
ffffffff8100a196
>] ? native_sched_clock+0x26/0x90
[<
ffffffff810b2128
>] ? trace_hardirqs_off_caller+0x28/0xc0
[<
ffffffff810b21cd
>] ? trace_hardirqs_off+0xd/0x10
[<
ffffffff811861f8
>] alloc_pages_current+0xb8/0x180
[<
ffffffff8113eaaa
>] __get_free_pages+0x2a/0x80
[<
ffffffff811934fe
>] kmalloc_order_trace+0x3e/0x1a0
[<
ffffffff81193955
>] __kmalloc+0x2f5/0x3a0
[<
ffffffff8104df0c
>] ? local_bh_enable_ip+0x7c/0xf0
[<
ffffffffa0401ab3
>] rds_message_alloc+0x23/0xb0 [rds]
[<
ffffffffa04043a1
>] rds_sendmsg+0x2b1/0x990 [rds]
[<
ffffffff810b21cd
>] ? trace_hardirqs_off+0xd/0x10
[<
ffffffff81564620
>] sock_sendmsg+0xb0/0xe0
[<
ffffffff810b2052
>] ? get_lock_stats+0x22/0x70
[<
ffffffff810b24be
>] ? put_lock_stats.isra.23+0xe/0x40
[<
ffffffff81567f30
>] sys_sendto+0x130/0x180
[<
ffffffff810b872d
>] ? trace_hardirqs_on+0xd/0x10
[<
ffffffff816c547b
>] ? _raw_spin_unlock_irq+0x3b/0x60
[<
ffffffff816cd767
>] ? sysret_check+0x1b/0x56
[<
ffffffff810b8695
>] ? trace_hardirqs_on_caller+0x115/0x1a0
[<
ffffffff81341d8e
>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[<
ffffffff816cd742
>] system_call_fastpath+0x16/0x1b
---[ end trace
eed6ae990d018c8b
]---
Reported-by: Dave Jones <
[email protected]
>
Cc: Dave Jones <
[email protected]
>
Cc: David S. Miller <
[email protected]
>
Cc: Venkat Venkatsubra <
[email protected]
>
Signed-off-by: Cong Wang <
[email protected]
>
Acked-by: Venkat Venkatsubra <
[email protected]
>
Signed-off-by: David S. Miller <
[email protected]
>
net/rds/message.c
patch
|
blob
|
history
diff --git
a/net/rds/message.c
b/net/rds/message.c
index f0a4658f3273e2e87bac1ae88058e1209ed3332a..aff589cc022e664962ac1570cbf410be7482b197 100644
(file)
--- a/
net/rds/message.c
+++ b/
net/rds/message.c
@@
-197,6
+197,9
@@
struct rds_message *rds_message_alloc(unsigned int extra_len, gfp_t gfp)
{
struct rds_message *rm;
+ if (extra_len > KMALLOC_MAX_SIZE - sizeof(struct rds_message))
+ return NULL;
+
rm = kzalloc(sizeof(struct rds_message) + extra_len, gfp);
if (!rm)
goto out;