| From 0fcc4c8c044e117ac126ab6df4138ea9a67fa2a9 Mon Sep 17 00:00:00 2001 |
| From: Jann Horn <jannh@google.com> |
| Date: Tue, 19 Mar 2019 02:36:59 +0100 |
| Subject: device_cgroup: fix RCU imbalance in error case |
| |
| From: Jann Horn <jannh@google.com> |
| |
| commit 0fcc4c8c044e117ac126ab6df4138ea9a67fa2a9 upstream. |
| |
| When dev_exception_add() returns an error (due to a failed memory |
| allocation), make sure that we move the RCU preemption count back to where |
| it was before we were called. We dropped the RCU read lock inside the loop |
| body, so we can't just "break". |
| |
| sparse complains about this, too: |
| |
| $ make -s C=2 security/device_cgroup.o |
| ./include/linux/rcupdate.h:647:9: warning: context imbalance in |
| 'propagate_exception' - unexpected unlock |
| |
| Fixes: d591fb56618f ("device_cgroup: simplify cgroup tree walk in propagate_exception()") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Jann Horn <jannh@google.com> |
| Acked-by: Michal Hocko <mhocko@suse.com> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| security/device_cgroup.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/security/device_cgroup.c |
| +++ b/security/device_cgroup.c |
| @@ -568,7 +568,7 @@ static int propagate_exception(struct de |
| devcg->behavior == DEVCG_DEFAULT_ALLOW) { |
| rc = dev_exception_add(devcg, ex); |
| if (rc) |
| - break; |
| + return rc; |
| } else { |
| /* |
| * in the other possible cases: |