Skip to content

Commit

Permalink
9pfs: forbid . and .. in file names
Browse files Browse the repository at this point in the history
According to the 9P spec http://man.cat-v.org/plan_9/5/open about the
create request:

The names . and .. are special; it is illegal to create files with these
names.

This patch causes the create and lcreate requests to fail with EINVAL if
the file name is either "." or "..".

Even if it isn't explicitly written in the spec, this patch extends the
checking to all requests that may cause a directory entry to be created:

    - mknod
    - rename
    - renameat
    - mkdir
    - link
    - symlink

The unlinkat request also gets patched for consistency (even if
rmdir("foo/..") is expected to fail according to POSIX.1-2001).

The various error values come from the linux manual pages.

Suggested-by: Peter Maydell <[email protected]>
Signed-off-by: Greg Kurz <[email protected]>
Reviewed-by: Eric Blake <[email protected]>
Reviewed-by: Michael S. Tsirkin <[email protected]>
Signed-off-by: Peter Maydell <[email protected]>
  • Loading branch information
gkurz authored and pm215 committed Aug 30, 2016
1 parent fff39a7 commit 805b5d9
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions hw/9pfs/9p.c
Original file line number Diff line number Diff line change
Expand Up @@ -1497,6 +1497,11 @@ static void v9fs_lcreate(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data) || !strcmp("..", name.data)) {
err = -EEXIST;
goto out_nofid;
}

fidp = get_fid(pdu, dfid);
if (fidp == NULL) {
err = -ENOENT;
Expand Down Expand Up @@ -2096,6 +2101,11 @@ static void v9fs_create(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data) || !strcmp("..", name.data)) {
err = -EEXIST;
goto out_nofid;
}

fidp = get_fid(pdu, fid);
if (fidp == NULL) {
err = -EINVAL;
Expand Down Expand Up @@ -2266,6 +2276,11 @@ static void v9fs_symlink(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data) || !strcmp("..", name.data)) {
err = -EEXIST;
goto out_nofid;
}

dfidp = get_fid(pdu, dfid);
if (dfidp == NULL) {
err = -EINVAL;
Expand Down Expand Up @@ -2345,6 +2360,11 @@ static void v9fs_link(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data) || !strcmp("..", name.data)) {
err = -EEXIST;
goto out_nofid;
}

dfidp = get_fid(pdu, dfid);
if (dfidp == NULL) {
err = -ENOENT;
Expand Down Expand Up @@ -2433,6 +2453,16 @@ static void v9fs_unlinkat(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data)) {
err = -EINVAL;
goto out_nofid;
}

if (!strcmp("..", name.data)) {
err = -ENOTEMPTY;
goto out_nofid;
}

dfidp = get_fid(pdu, dfid);
if (dfidp == NULL) {
err = -EINVAL;
Expand Down Expand Up @@ -2545,6 +2575,11 @@ static void v9fs_rename(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data) || !strcmp("..", name.data)) {
err = -EISDIR;
goto out_nofid;
}

fidp = get_fid(pdu, fid);
if (fidp == NULL) {
err = -ENOENT;
Expand Down Expand Up @@ -2662,6 +2697,12 @@ static void v9fs_renameat(void *opaque)
goto out_err;
}

if (!strcmp(".", old_name.data) || !strcmp("..", old_name.data) ||
!strcmp(".", new_name.data) || !strcmp("..", new_name.data)) {
err = -EISDIR;
goto out_err;
}

v9fs_path_write_lock(s);
err = v9fs_complete_renameat(pdu, olddirfid,
&old_name, newdirfid, &new_name);
Expand Down Expand Up @@ -2877,6 +2918,11 @@ static void v9fs_mknod(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data) || !strcmp("..", name.data)) {
err = -EEXIST;
goto out_nofid;
}

fidp = get_fid(pdu, fid);
if (fidp == NULL) {
err = -ENOENT;
Expand Down Expand Up @@ -3033,6 +3079,11 @@ static void v9fs_mkdir(void *opaque)
goto out_nofid;
}

if (!strcmp(".", name.data) || !strcmp("..", name.data)) {
err = -EEXIST;
goto out_nofid;
}

fidp = get_fid(pdu, fid);
if (fidp == NULL) {
err = -ENOENT;
Expand Down

0 comments on commit 805b5d9

Please sign in to comment.