summaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorManfred Spraul <manfred@colorfullife.com>2017-07-12 17:35:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-12 19:26:02 -0400
commit51c23b7b7db52493d4fc869cec8c3e8fe27bfcd3 (patch)
tree087792a59b22078d3e88f70ad413ed5401403d6e /ipc
parenta2642f8770993a1598500bb6a8082b7c32faff8b (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.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/ipc/msg.c b/ipc/msg.c
index 10094a731b8e..cd90bfde89a4 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -132,7 +132,7 @@ static struct msg_queue *msg_alloc(void)
132static int newque(struct ipc_namespace *ns, struct ipc_params *params) 132static 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);