summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/fs.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/fs.c b/fs/fs.c
index b67bf42ba4..73584d57e1 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -1866,14 +1866,17 @@ static struct filename *getname(const char *filename)
{
struct filename *result;
+ if (!*filename)
+ return ERR_PTR(-ENOENT);
+
result = malloc(sizeof(*result));
if (!result)
- return NULL;
+ return ERR_PTR(-ENOMEM);
result->name = strdup(filename);
if (!result->name) {
free(result);
- return NULL;
+ return ERR_PTR(-ENOMEM);
}
result->refcnt = 1;
@@ -2186,6 +2189,9 @@ static int filename_lookup(int dfd, struct filename *name, unsigned flags,
struct nameidata nd;
const char *s;
+ if (IS_ERR(name))
+ return PTR_ERR(name);
+
set_nameidata(&nd, dfd, name);
s = path_init(&nd, flags);
@@ -2362,8 +2368,14 @@ int open(const char *pathname, int flags, ...)
struct dentry *dentry = NULL;
struct nameidata nd;
const char *s;
+ struct filename *filename;
+
+ filename = getname(pathname);
+ if (IS_ERR(filename))
+ return PTR_ERR(filename);
+
+ set_nameidata(&nd, AT_FDCWD, filename);
- set_nameidata(&nd, AT_FDCWD, getname(pathname));
s = path_init(&nd, LOOKUP_FOLLOW);
while (1) {