mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
ANDROID: regression introduced override_creds=off
Solve a regression introduced by commit 272fcd1ca7ceb252b1c3a2961110c7c1722707cf ("ANDROID: overlayfs: override_creds=off option bypass creator_cred") where a crash is observed a crash in ovl_create_or_link() when a simple re-direction command in vendor directory. /vendor/bin/<Any test> > /vendor/bin/test_log.txt 2>&1& After further debugging we see that if the output is redirected to a file which doesn’t exist we see this stack: [ 377.382745] ovl_create_or_link+0xac/0x710 [ 377.382745] ovl_create_object+0xb8/0x110 [ 377.382745] ovl_create+0x34/0x40 [ 377.382745] path_openat+0xd44/0x15a8 [ 377.382745] do_filp_open+0x80/0x128 [ 377.382745] do_sys_open+0x140/0x250 [ 377.382745] __arm64_sys_openat+0x2c/0x38 ovl_override_creds returns NULL because the override_cred flag is set to false. This causes ovl_revert_creds also to fail. There is another call to check override_cred in override_cred call which overrides the creds permanently as there no revert_creds associated. So whenever next commit_cred is called we see the crash as the credentials are permanently overridden. Signed-off-by: Mark Salyzyn <salyzyn@google.com> Tested-by: Rishabh/Jeevan <jshriram@qualcomm.corp-partner.google.com> Bug: 140816499 Change-Id: Icd0d9be82fc57af5ead1eeab99f79adf3adf62ef
This commit is contained in:
parent
c890d5ab00
commit
f1bf45bfb9
@ -469,7 +469,7 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
|
||||
bool origin)
|
||||
{
|
||||
int err;
|
||||
const struct cred *old_cred;
|
||||
const struct cred *old_cred, *hold_cred = NULL;
|
||||
struct cred *override_cred;
|
||||
struct dentry *parent = dentry->d_parent;
|
||||
|
||||
@ -504,7 +504,7 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
|
||||
goto out_revert_creds;
|
||||
}
|
||||
}
|
||||
put_cred(override_creds(override_cred));
|
||||
hold_cred = override_creds(override_cred);
|
||||
put_cred(override_cred);
|
||||
|
||||
if (!ovl_dentry_is_whiteout(dentry))
|
||||
@ -515,7 +515,9 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
|
||||
hardlink);
|
||||
}
|
||||
out_revert_creds:
|
||||
ovl_revert_creds(old_cred);
|
||||
ovl_revert_creds(old_cred ?: hold_cred);
|
||||
if (old_cred && hold_cred)
|
||||
put_cred(hold_cred);
|
||||
if (!err) {
|
||||
struct inode *realinode = d_inode(ovl_dentry_upper(dentry));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user