From 17bd9a7f7813f1d0eaed711b84e383f3bba2780f Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Mon, 15 Jul 2019 10:42:42 -0700 Subject: [PATCH] ANDROID: overlayfs ovl_create_of_link regression A comedy of errors caused a regression. Fixes a regression in commit 272fcd1ca7ceb252b1c3a2961110c7c1722707cf ("ANDROID: overlayfs: override_creds=off option bypass creator_cred") in combination with commit aab9adb4b81bcce107dd1783f6ac41dc1abe9f15 ("Merge 4.4.179 into android-4.4") that took in an incomplete backport of commit 54a07fff4b217607e862b2e1e3fcec32919ad583 ("ovl: fix uid/gid when creating over whiteout") (or upstream commit d0e13f5bbe4be7c8f27736fc40503dcec04b7de0 ("ovl: fix uid/gid when creating over whiteout")) which did not recognize that ovl_override_creds can return a NULL pointer. Signed-off-by: Mark Salyzyn (cherry picked from https://lore.kernel.org/patchwork/patch/1009299) Bug: 109821005 Bug: 112955896 Bug: 127298877 Bug: 137541192 Change-Id: Ia6b71a653d1bf728db610e384864bd82d335b923 --- fs/overlayfs/dir.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index d7d880f9495b..4cc40de38dff 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -415,8 +415,13 @@ static int ovl_create_or_link(struct dentry *dentry, int mode, dev_t rdev, err = -ENOMEM; override_cred = prepare_creds(); if (override_cred) { - override_cred->fsuid = old_cred->fsuid; - override_cred->fsgid = old_cred->fsgid; + const struct cred *our_cred; + + our_cred = old_cred; + if (!our_cred) + our_cred = current_cred(); + override_cred->fsuid = our_cred->fsuid; + override_cred->fsgid = our_cred->fsgid; put_cred(override_creds(override_cred)); put_cred(override_cred);