diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2015-02-26 17:12:30 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2015-02-26 17:12:30 +0100 |
commit | 0ecd21258e24fec185c157520435783780a1ad8f (patch) | |
tree | 5a2c8bd09c01d701420a47190fa4df7b394faec5 | |
parent | f2f4d1c312784a5909bb931cc8d68287c8c81326 (diff) | |
download | fuse-0ecd21258e24fec185c157520435783780a1ad8f.tar.gz |
libfuse: fix handling of '.' and '..' in highlevel readdirplus
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | lib/fuse.c | 16 |
2 files changed, 14 insertions, 4 deletions
@@ -3,6 +3,8 @@ * libfuse: fix fuse_remove_signal_handlers() to properly restore the default signal handler. Reported by: Chris Johnson + * libfuse: fix handling of '.' and '..' in highlevel readdirplus + 2014-07-21 Miklos Szeredi <miklos@szeredi.hu> * libfuse: highlevel API: fix directory file handle passed to @@ -3418,6 +3418,12 @@ static int fill_dir(void *dh_, const char *name, const struct stat *statp, return 0; } +static int is_dot_or_dotdot(const char *name) +{ + return name[0] == '.' && (name[1] == '\0' || + (name[1] == '.' && name[2] == '\0')); +} + static int fill_dir_plus(void *dh_, const char *name, const struct stat *statp, off_t off, enum fuse_fill_dir_flags flags) { @@ -3437,10 +3443,12 @@ static int fill_dir_plus(void *dh_, const char *name, const struct stat *statp, if (off && statp && (flags & FUSE_FILL_DIR_PLUS)) { e.attr = *statp; - res = do_lookup(f, dh->nodeid, name, &e); - if (res) { - dh->error = res; - return 1; + if (!is_dot_or_dotdot(name)) { + res = do_lookup(f, dh->nodeid, name, &e); + if (res) { + dh->error = res; + return 1; + } } } else { e.attr.st_ino = FUSE_UNKNOWN_INO; |