Skip to content

Commit 35ad1be

Browse files
authored
Fix race condition when modifying devpts selinux context
1 parent 37ef0d2 commit 35ad1be

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

kernel/sucompat.c

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,27 +166,33 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user,
166166

167167
int ksu_handle_devpts(struct inode *inode)
168168
{
169-
if (!current->mm) {
170-
return 0;
171-
}
169+
struct inode *in;
170+
struct inode_security_struct *sec;
172171

173-
uid_t uid = current_uid().val;
174-
if (uid % 100000 < 10000) {
175-
// not untrusted_app, ignore it
176-
return 0;
172+
if (!current->mm)
173+
return 0;
174+
175+
uid_t uid = current_uid().val;
176+
if (uid % 100000 < 10000) {
177+
// not untrusted_app
178+
return 0;
177179
}
178180

179181
if (!ksu_is_allow_uid(uid))
180182
return 0;
181183

182-
if (ksu_devpts_sid) {
183-
struct inode_security_struct *sec = selinux_inode(inode);
184-
if (sec) {
185-
sec->sid = ksu_devpts_sid;
186-
}
187-
}
184+
in = igrab(inode);
185+
if (!in)
186+
return 0;
188187

189-
return 0;
188+
inode_lock(in);
189+
sec = selinux_inode(in);
190+
if (sec && ksu_devpts_sid)
191+
WRITE_ONCE(sec->sid, ksu_devpts_sid);
192+
inode_unlock(in);
193+
194+
iput(in);
195+
return 0;
190196
}
191197

192198
#ifdef CONFIG_KPROBES

0 commit comments

Comments
 (0)