@@ -876,7 +876,8 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
876876 lookup_flags |= LOOKUP_DIRECTORY ;
877877 if (!(flags & O_NOFOLLOW ))
878878 lookup_flags |= LOOKUP_FOLLOW ;
879- return lookup_flags ;
879+ op -> lookup_flags = lookup_flags ;
880+ return 0 ;
880881}
881882
882883/**
@@ -893,8 +894,8 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
893894struct file * file_open_name (struct filename * name , int flags , umode_t mode )
894895{
895896 struct open_flags op ;
896- int lookup = build_open_flags (flags , mode , & op );
897- return do_filp_open (AT_FDCWD , name , & op , lookup );
897+ int err = build_open_flags (flags , mode , & op );
898+ return err ? ERR_PTR ( err ) : do_filp_open (AT_FDCWD , name , & op );
898899}
899900
900901/**
@@ -919,37 +920,43 @@ struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
919920 const char * filename , int flags )
920921{
921922 struct open_flags op ;
922- int lookup = build_open_flags (flags , 0 , & op );
923+ int err = build_open_flags (flags , 0 , & op );
924+ if (err )
925+ return ERR_PTR (err );
923926 if (flags & O_CREAT )
924927 return ERR_PTR (- EINVAL );
925928 if (!filename && (flags & O_DIRECTORY ))
926929 if (!dentry -> d_inode -> i_op -> lookup )
927930 return ERR_PTR (- ENOTDIR );
928- return do_file_open_root (dentry , mnt , filename , & op , lookup );
931+ return do_file_open_root (dentry , mnt , filename , & op );
929932}
930933EXPORT_SYMBOL (file_open_root );
931934
932935long do_sys_open (int dfd , const char __user * filename , int flags , umode_t mode )
933936{
934937 struct open_flags op ;
935- int lookup = build_open_flags (flags , mode , & op );
936- struct filename * tmp = getname (filename );
937- int fd = PTR_ERR (tmp );
938-
939- if (!IS_ERR (tmp )) {
940- fd = get_unused_fd_flags (flags );
941- if (fd >= 0 ) {
942- struct file * f = do_filp_open (dfd , tmp , & op , lookup );
943- if (IS_ERR (f )) {
944- put_unused_fd (fd );
945- fd = PTR_ERR (f );
946- } else {
947- fsnotify_open (f );
948- fd_install (fd , f );
949- }
938+ int fd = build_open_flags (flags , mode , & op );
939+ struct filename * tmp ;
940+
941+ if (fd )
942+ return fd ;
943+
944+ tmp = getname (filename );
945+ if (IS_ERR (tmp ))
946+ return PTR_ERR (tmp );
947+
948+ fd = get_unused_fd_flags (flags );
949+ if (fd >= 0 ) {
950+ struct file * f = do_filp_open (dfd , tmp , & op );
951+ if (IS_ERR (f )) {
952+ put_unused_fd (fd );
953+ fd = PTR_ERR (f );
954+ } else {
955+ fsnotify_open (f );
956+ fd_install (fd , f );
950957 }
951- putname (tmp );
952958 }
959+ putname (tmp );
953960 return fd ;
954961}
955962
0 commit comments