|
@@ -198,15 +198,19 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
|
|
|
}
|
|
|
|
|
|
static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
|
|
|
- uid_t uid, uid_t euid, int force)
|
|
|
+ int force)
|
|
|
{
|
|
|
write_lock_irq(&filp->f_owner.lock);
|
|
|
if (force || !filp->f_owner.pid) {
|
|
|
put_pid(filp->f_owner.pid);
|
|
|
filp->f_owner.pid = get_pid(pid);
|
|
|
filp->f_owner.pid_type = type;
|
|
|
- filp->f_owner.uid = uid;
|
|
|
- filp->f_owner.euid = euid;
|
|
|
+
|
|
|
+ if (pid) {
|
|
|
+ const struct cred *cred = current_cred();
|
|
|
+ filp->f_owner.uid = cred->uid;
|
|
|
+ filp->f_owner.euid = cred->euid;
|
|
|
+ }
|
|
|
}
|
|
|
write_unlock_irq(&filp->f_owner.lock);
|
|
|
}
|
|
@@ -214,14 +218,13 @@ static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
|
|
|
int __f_setown(struct file *filp, struct pid *pid, enum pid_type type,
|
|
|
int force)
|
|
|
{
|
|
|
- const struct cred *cred = current_cred();
|
|
|
int err;
|
|
|
-
|
|
|
+
|
|
|
err = security_file_set_fowner(filp);
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
- f_modown(filp, pid, type, cred->uid, cred->euid, force);
|
|
|
+ f_modown(filp, pid, type, force);
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(__f_setown);
|
|
@@ -247,7 +250,7 @@ EXPORT_SYMBOL(f_setown);
|
|
|
|
|
|
void f_delown(struct file *filp)
|
|
|
{
|
|
|
- f_modown(filp, NULL, PIDTYPE_PID, 0, 0, 1);
|
|
|
+ f_modown(filp, NULL, PIDTYPE_PID, 1);
|
|
|
}
|
|
|
|
|
|
pid_t f_getown(struct file *filp)
|