From 65afea1f884716488005321d54dcdb147dd16d2e Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 14 Sep 2004 07:13:45 +0000 Subject: [PATCH] fix --- ChangeLog | 5 +++++ lib/fuse.c | 29 ++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8f083f5..963df14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-09-14 Miklos Szeredi + + * Check temporary file creation failure in do_getdir(). Bug + spotted by Terje Oseberg + 2004-09-13 Miklos Szeredi * Allow "large_read" option for 2.6 kernels but warn of deprecation diff --git a/lib/fuse.c b/lib/fuse.c index 6c998c3..659643b 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -761,20 +761,27 @@ static void do_getdir(struct fuse *f, struct fuse_in_header *in) dh.fuse = f; dh.fp = tmpfile(); dh.dir = in->ino; - res = -ENOENT; - path = get_path(f, in->ino); - if (path != NULL) { - res = -ENOSYS; - if (f->op.getdir) - res = f->op.getdir(path, &dh, (fuse_dirfil_t) fill_dir); - free(path); - } - fflush(dh.fp); + res = -EIO; + if (dh.fp == NULL) + perror("fuse: failed to create temporary file"); + else { + res = -ENOENT; + path = get_path(f, in->ino); + if (path != NULL) { + res = -ENOSYS; + if (f->op.getdir) + res = f->op.getdir(path, &dh, (fuse_dirfil_t) fill_dir); + free(path); + } + fflush(dh.fp); + } memset(&arg, 0, sizeof(struct fuse_getdir_out)); - arg.fd = fileno(dh.fp); + if (res == 0) + arg.fd = fileno(dh.fp); send_reply(f, in, res, &arg, sizeof(arg)); - fclose(dh.fp); + if (dh.fp != NULL) + fclose(dh.fp); } static void do_mknod(struct fuse *f, struct fuse_in_header *in, -- 2.30.2