On Sat, Mar 28, 2009 at 11:21:27PM +0000, Hugh Dickins wrote: > check_unsafe_exec() also notes whether the fs_struct is being > shared by more threads than will get killed by the exec, and if so > sets LSM_UNSAFE_SHARE to make bprm_set_creds() careful about euid. > But /proc/<pid>/cwd and /proc/<pid>/root lookups make transient > use of get_fs_struct(), which also raises that sharing count. > > This might occasionally cause a setuid program not to change euid, > in the same way as happened with files->count (check_unsafe_exec > also looks at sighand->count, but /proc doesn't raise that one). > > We'd prefer exec not to unshare fs_struct: so fix this in procfs, > replacing get_fs_struct() by get_fs_path(), which does path_get > while still holding task_lock, instead of raising fs->count. > --- 2.6.29/fs/proc/base.c > +++ linux/fs/proc/base.c > @@ -146,15 +146,22 @@ static unsigned int pid_entry_count_dirs > return count; > } > > -static struct fs_struct *get_fs_struct(struct task_struct *task) > +static int get_fs_path(struct task_struct *task, struct path *path, bool root) > { > struct fs_struct *fs; > + int result = -ENOENT; > + > task_lock(task); > fs = task->fs; > - if(fs) > - atomic_inc(&fs->count); > + if (fs) { > + read_lock(&fs->lock); > + *path = root ? fs->root : fs->pwd; > + path_get(path); > + read_unlock(&fs->lock); > + result = 0; > + } > task_unlock(task); > - return fs; > + return result; > } I think it's better to open-code. "root" parameter is unnatural. -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html