diff options
author | Manfred Spraul <manfred@colorfullife.com> | 2017-07-12 17:35:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-12 19:26:02 -0400 |
commit | 51c23b7b7db52493d4fc869cec8c3e8fe27bfcd3 (patch) | |
tree | 087792a59b22078d3e88f70ad413ed5401403d6e /ipc | |
parent | a2642f8770993a1598500bb6a8082b7c32faff8b (diff) |
ipc/msg.c: avoid ipc_rcu_putref for failed ipc_addid()
Loosely based on a patch from Kees Cook <keescook@chromium.org>:
- id and retval can be merged
- if ipc_addid() fails, then use call_rcu() directly.
The difference is that call_rcu is used for failed ipc_addid() calls, to
continue to guaranteed an rcu delay for security_msg_queue_free().
Link: http://lkml.kernel.org/r/20170525185107.12869-16-manfred@colorfullife.com
Signed-off-by: Manfred Spraul <manfred@colorfullife.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/msg.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -132,7 +132,7 @@ static struct msg_queue *msg_alloc(void) | |||
132 | static int newque(struct ipc_namespace *ns, struct ipc_params *params) | 132 | static int newque(struct ipc_namespace *ns, struct ipc_params *params) |
133 | { | 133 | { |
134 | struct msg_queue *msq; | 134 | struct msg_queue *msq; |
135 | int id, retval; | 135 | int retval; |
136 | key_t key = params->key; | 136 | key_t key = params->key; |
137 | int msgflg = params->flg; | 137 | int msgflg = params->flg; |
138 | 138 | ||
@@ -160,10 +160,10 @@ static int newque(struct ipc_namespace *ns, struct ipc_params *params) | |||
160 | INIT_LIST_HEAD(&msq->q_senders); | 160 | INIT_LIST_HEAD(&msq->q_senders); |
161 | 161 | ||
162 | /* ipc_addid() locks msq upon success. */ | 162 | /* ipc_addid() locks msq upon success. */ |
163 | id = ipc_addid(&msg_ids(ns), &msq->q_perm, ns->msg_ctlmni); | 163 | retval = ipc_addid(&msg_ids(ns), &msq->q_perm, ns->msg_ctlmni); |
164 | if (id < 0) { | 164 | if (retval < 0) { |
165 | ipc_rcu_putref(&msq->q_perm, msg_rcu_free); | 165 | call_rcu(&msq->q_perm.rcu, msg_rcu_free); |
166 | return id; | 166 | return retval; |
167 | } | 167 | } |
168 | 168 | ||
169 | ipc_unlock_object(&msq->q_perm); | 169 | ipc_unlock_object(&msq->q_perm); |