Răsfoiți Sursa

make sure that fchdir() won't accept referral points, etc.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 8 ani în urmă
părinte
comite
159b095628
1 a modificat fișierele cu 3 adăugiri și 6 ștergeri
  1. 3 6
      fs/open.c

+ 3 - 6
fs/open.c

@@ -459,20 +459,17 @@ out:
 SYSCALL_DEFINE1(fchdir, unsigned int, fd)
 {
 	struct fd f = fdget_raw(fd);
-	struct inode *inode;
-	int error = -EBADF;
+	int error;
 
 	error = -EBADF;
 	if (!f.file)
 		goto out;
 
-	inode = file_inode(f.file);
-
 	error = -ENOTDIR;
-	if (!S_ISDIR(inode->i_mode))
+	if (!d_can_lookup(f.file->f_path.dentry))
 		goto out_putf;
 
-	error = inode_permission(inode, MAY_EXEC | MAY_CHDIR);
+	error = inode_permission(file_inode(f.file), MAY_EXEC | MAY_CHDIR);
 	if (!error)
 		set_fs_pwd(current->fs, &f.file->f_path);
 out_putf: