From 28a1db03442fa3d076dc3271ce4adb7f38bc85a9 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Wed, 27 Mar 2013 10:26:02 +1100 Subject: [PATCH] ipcsem-open-code-and-rename-sem_lock-fix propagate the ipc_obtain_object() errno out of sem_obtain_lock() Cc: Chegu Vinod Cc: Davidlohr Bueso Cc: Emmanuel Benisty Cc: Jason Low Cc: Linus Torvalds Cc: Michel Lespinasse Cc: Peter Hurley Cc: Rik van Riel Cc: Rik van Riel Cc: Stanislav Kinsbursky Signed-off-by: Andrew Morton --- ipc/sem.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ipc/sem.c b/ipc/sem.c index 26c39ec01ab7..290acca89894 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -197,26 +197,28 @@ void __init sem_init (void) static inline struct sem_array *sem_obtain_lock(struct ipc_namespace *ns, int id) { struct kern_ipc_perm *ipcp; + struct sem_array *sma; rcu_read_lock(); ipcp = ipc_obtain_object(&sem_ids(ns), id); - if (IS_ERR(ipcp)) - goto err1; + if (IS_ERR(ipcp)) { + sma = ERR_CAST(ipcp); + goto err; + } spin_lock(&ipcp->lock); /* ipc_rmid() may have already freed the ID while sem_lock * was spinning: verify that the structure is still valid */ - if (ipcp->deleted) - goto err0; + if (!ipcp->deleted) + return container_of(ipcp, struct sem_array, sem_perm); - return container_of(ipcp, struct sem_array, sem_perm); -err0: spin_unlock(&ipcp->lock); -err1: + sma = ERR_PTR(-EINVAL); +err: rcu_read_unlock(); - return ERR_PTR(-EINVAL); + return sma; } static inline struct sem_array *sem_obtain_object(struct ipc_namespace *ns, int id) -- 2.39.5