aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2004-09-14 07:13:45 +0000
committerGravatar Miklos Szeredi <miklos@szeredi.hu>2004-09-14 07:13:45 +0000
commit65afea1f884716488005321d54dcdb147dd16d2e (patch)
treec5c07e448c81ba09658accac8129f576506c0aff
parent442d96559f69616c5ddb4a859dd29a5bbee8804c (diff)
fix
-rw-r--r--ChangeLog5
-rw-r--r--lib/fuse.c29
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 <miklos@szeredi.hu>
+
+ * Check temporary file creation failure in do_getdir(). Bug
+ spotted by Terje Oseberg
+
2004-09-13 Miklos Szeredi <miklos@szeredi.hu>
* 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,