diff options
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/fs/namei.c b/fs/namei.c index 7657be4352bf..ac6d214da827 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -137,7 +137,7 @@ static int do_getname(const char __user *filename, char *page) | |||
137 | return retval; | 137 | return retval; |
138 | } | 138 | } |
139 | 139 | ||
140 | static char *getname_flags(const char __user * filename, int flags) | 140 | static char *getname_flags(const char __user *filename, int flags, int *empty) |
141 | { | 141 | { |
142 | char *tmp, *result; | 142 | char *tmp, *result; |
143 | 143 | ||
@@ -148,6 +148,8 @@ static char *getname_flags(const char __user * filename, int flags) | |||
148 | 148 | ||
149 | result = tmp; | 149 | result = tmp; |
150 | if (retval < 0) { | 150 | if (retval < 0) { |
151 | if (retval == -ENOENT && empty) | ||
152 | *empty = 1; | ||
151 | if (retval != -ENOENT || !(flags & LOOKUP_EMPTY)) { | 153 | if (retval != -ENOENT || !(flags & LOOKUP_EMPTY)) { |
152 | __putname(tmp); | 154 | __putname(tmp); |
153 | result = ERR_PTR(retval); | 155 | result = ERR_PTR(retval); |
@@ -160,7 +162,7 @@ static char *getname_flags(const char __user * filename, int flags) | |||
160 | 162 | ||
161 | char *getname(const char __user * filename) | 163 | char *getname(const char __user * filename) |
162 | { | 164 | { |
163 | return getname_flags(filename, 0); | 165 | return getname_flags(filename, 0, 0); |
164 | } | 166 | } |
165 | 167 | ||
166 | #ifdef CONFIG_AUDITSYSCALL | 168 | #ifdef CONFIG_AUDITSYSCALL |
@@ -1798,11 +1800,11 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) | |||
1798 | return __lookup_hash(&this, base, NULL); | 1800 | return __lookup_hash(&this, base, NULL); |
1799 | } | 1801 | } |
1800 | 1802 | ||
1801 | int user_path_at(int dfd, const char __user *name, unsigned flags, | 1803 | int user_path_at_empty(int dfd, const char __user *name, unsigned flags, |
1802 | struct path *path) | 1804 | struct path *path, int *empty) |
1803 | { | 1805 | { |
1804 | struct nameidata nd; | 1806 | struct nameidata nd; |
1805 | char *tmp = getname_flags(name, flags); | 1807 | char *tmp = getname_flags(name, flags, empty); |
1806 | int err = PTR_ERR(tmp); | 1808 | int err = PTR_ERR(tmp); |
1807 | if (!IS_ERR(tmp)) { | 1809 | if (!IS_ERR(tmp)) { |
1808 | 1810 | ||
@@ -1816,6 +1818,12 @@ int user_path_at(int dfd, const char __user *name, unsigned flags, | |||
1816 | return err; | 1818 | return err; |
1817 | } | 1819 | } |
1818 | 1820 | ||
1821 | int user_path_at(int dfd, const char __user *name, unsigned flags, | ||
1822 | struct path *path) | ||
1823 | { | ||
1824 | return user_path_at_empty(dfd, name, flags, path, 0); | ||
1825 | } | ||
1826 | |||
1819 | static int user_path_parent(int dfd, const char __user *path, | 1827 | static int user_path_parent(int dfd, const char __user *path, |
1820 | struct nameidata *nd, char **name) | 1828 | struct nameidata *nd, char **name) |
1821 | { | 1829 | { |