diff options
author | Kees Cook <keescook@chromium.org> | 2017-07-13 00:34:50 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-13 02:26:01 +0300 |
commit | 1b4654ef72f61c84704b3c79b50fdeed8747fc56 (patch) | |
tree | 2000d23e0b175f738608eff7605761534017f465 /ipc/sem.c | |
parent | f8dbe8d290637ac3f68600e30d092393fe9b40a5 (diff) | |
download | linux-1b4654ef72f61c84704b3c79b50fdeed8747fc56.tar.xz |
ipc/sem: do not use ipc_rcu_free()
Avoid using ipc_rcu_free, since it just re-finds the original structure
pointer. For the pre-list-init failure path, there is no RCU needed,
since it was just allocated. It can be directly freed.
Link: http://lkml.kernel.org/r/20170525185107.12869-6-manfred@colorfullife.com
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Manfred Spraul <manfred@colorfullife.com>
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/sem.c')
-rw-r--r-- | ipc/sem.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/ipc/sem.c b/ipc/sem.c index 484ccf83cf85..a04c4d6d120c 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -258,13 +258,18 @@ static void merge_queues(struct sem_array *sma) } } +static void __sem_free(struct sem_array *sma) +{ + kvfree(sma); +} + static void sem_rcu_free(struct rcu_head *head) { struct kern_ipc_perm *p = container_of(head, struct kern_ipc_perm, rcu); struct sem_array *sma = container_of(p, struct sem_array, sem_perm); security_sem_free(sma); - ipc_rcu_free(head); + __sem_free(sma); } /* @@ -482,7 +487,7 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params) sma->sem_perm.security = NULL; retval = security_sem_alloc(sma); if (retval) { - ipc_rcu_putref(&sma->sem_perm, ipc_rcu_free); + __sem_free(sma); return retval; } |