From 5fba5cdbb8f4002479362e52278fa59aa14d43e0 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Sat, 5 Mar 2005 17:25:28 +0000 Subject: [PATCH] add stuff to bugfix branch --- ChangeLog | 33 +++++++++++++++++++++++++++++++++ NEWS | 4 ++++ README | 5 ++++- configure.in | 2 +- fuse.pc.in | 2 +- kernel/configure.ac | 2 +- kernel/dev.c | 5 ++--- kernel/dir.c | 1 + kernel/file.c | 1 + kernel/inode.c | 6 +++++- lib/Makefile.am | 2 +- lib/fuse.c | 3 +++ lib/helper.c | 15 ++++++++------- util/fusermount.c | 5 +++++ 14 files changed, 70 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 54871d7..15835f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,36 @@ +2005-03-05 Miklos Szeredi + + * Released 2.2.1 + +2005-03-04 Miklos Szeredi + + * kernel: fix nasty bug which could cause an Oops under certain + situations. Found by Magnus Johansson + +2005-02-28 Miklos Szeredi + + * kernel: llseek() method for files and directories made explicit + + * kernel: fixed inode leak in NFS export in case of nodeid + wrapping + +2005-02-15 Miklos Szeredi + + * libfuse: clean up some unitialized memory found with valgrind + + * Add -lpthread to Libs in fuse.pc. Valgrind seems to need an + explicitly linked libpthread for applications + +2005-02-10 Miklos Szeredi + + * fusermount: set umask, otherwise /etc/mtab will have + unpredictable permission. Spotted by Jindrich Kolorenc + + * fusermount: set owner and group of /etc/mtab to original values + on unmount + + * libfuse: add 'use_ino' option to help. Patch by Valient Gough + 2005-02-02 Miklos Szeredi * Released 2.2 diff --git a/NEWS b/NEWS index d69c410..ff632a9 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +What is new in 2.2.1 + + - Bug fixes + What is new in 2.2 Userspace changes: diff --git a/README b/README index 14eed40..e14e37e 100644 --- a/README +++ b/README @@ -25,7 +25,10 @@ make make install modprobe fuse -Also see the file 'INSTALL' +You may also need to add '/usr/local/lib' to '/etc/ld.so.conf' and/or +run ldconfig. + +For more details see the file 'INSTALL' How To Use ========== diff --git a/configure.in b/configure.in index d8a9f05..93c2f13 100644 --- a/configure.in +++ b/configure.in @@ -1,4 +1,4 @@ -AC_INIT(fuse, 2.2) +AC_INIT(fuse, 2.2.1) AM_INIT_AUTOMAKE AM_CONFIG_HEADER(include/config.h) diff --git a/fuse.pc.in b/fuse.pc.in index 54f0c49..669d33f 100644 --- a/fuse.pc.in +++ b/fuse.pc.in @@ -6,5 +6,5 @@ includedir=@includedir@ Name: fuse Description: Filesystem in Userspace Version: @VERSION@ -Libs: -L${libdir} -lfuse +Libs: -L${libdir} -lfuse -lpthread Cflags: -I${includedir}/fuse -D_FILE_OFFSET_BITS=64 diff --git a/kernel/configure.ac b/kernel/configure.ac index 62c2b2f..a27ceca 100644 --- a/kernel/configure.ac +++ b/kernel/configure.ac @@ -1,4 +1,4 @@ -AC_INIT(fuse-kernel, 2.2) +AC_INIT(fuse-kernel, 2.2.1) AC_CONFIG_HEADERS([config.h]) AC_PROG_INSTALL diff --git a/kernel/dev.c b/kernel/dev.c index f6e8b1f..f3de9de 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -159,12 +159,11 @@ struct fuse_req *fuse_get_request_nonint(struct fuse_conn *fc) static void fuse_putback_request(struct fuse_conn *fc, struct fuse_req *req) { - if (!req->preallocated) - fuse_request_free(req); - spin_lock(&fuse_lock); if (req->preallocated) list_add(&req->list, &fc->unused_list); + else + fuse_request_free(req); if (fc->outstanding_debt) fc->outstanding_debt--; diff --git a/kernel/dir.c b/kernel/dir.c index 7903a66..be51309 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -1016,6 +1016,7 @@ static struct inode_operations fuse_dir_inode_operations = { }; static struct file_operations fuse_dir_operations = { + .llseek = generic_file_llseek, .read = generic_read_dir, .readdir = fuse_readdir, .open = fuse_dir_open, diff --git a/kernel/file.c b/kernel/file.c index 3adcb30..74921d6 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -641,6 +641,7 @@ static int fuse_set_page_dirty(struct page *page) #endif static struct file_operations fuse_file_operations = { + .llseek = generic_file_llseek, .read = fuse_file_read, .write = fuse_file_write, .mmap = fuse_file_mmap, diff --git a/kernel/inode.c b/kernel/inode.c index 67bc755..d935d58 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -530,8 +530,12 @@ static struct dentry *fuse_get_dentry(struct super_block *sb, void *vobjp) return ERR_PTR(-ESTALE); inode = ilookup5(sb, nodeid, fuse_inode_eq, &nodeid); - if (!inode || inode->i_generation != generation) + if (!inode) + return ERR_PTR(-ESTALE); + if (inode->i_generation != generation) { + iput(inode); return ERR_PTR(-ESTALE); + } entry = d_alloc_anon(inode); if (!entry) { diff --git a/lib/Makefile.am b/lib/Makefile.am index 952dcd8..5dcb9e6 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -9,7 +9,7 @@ libfuse_la_SOURCES = \ mount.c \ fuse_i.h -libfuse_la_LDFLAGS = -lpthread -version-number 2:2:0 \ +libfuse_la_LDFLAGS = -lpthread -version-number 2:2:1 \ -Wl,--version-script,fuse_versionscript EXTRA_DIST = fuse_versionscript diff --git a/lib/fuse.c b/lib/fuse.c index 0980388..a7ba0ee 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -1076,6 +1076,7 @@ static void do_open(struct fuse *f, struct fuse_in_header *in, struct fuse_open_out outarg; struct fuse_file_info fi; + memset(&outarg, 0, sizeof(outarg)); memset(&fi, 0, sizeof(fi)); fi.flags = arg->flags; res = -ENOENT; @@ -1552,9 +1553,11 @@ static void do_opendir(struct fuse *f, struct fuse_in_header *in, (void) arg; + memset(&outarg, 0, sizeof(outarg)); res = -ENOMEM; dh = (struct fuse_dirhandle *) malloc(sizeof(struct fuse_dirhandle)); if (dh != NULL) { + memset(dh, 0, sizeof(struct fuse_dirhandle)); dh->fuse = f; dh->fp = tmpfile(); dh->filled = 0; diff --git a/lib/helper.c b/lib/helper.c index 879a694..42fe44c 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -26,12 +26,12 @@ static void usage(const char *progname) fprintf(stderr, "FUSE options:\n" - " -d enable debug output (implies -f)\n" - " -f foreground operation\n" - " -s disable multithreaded operation\n" - " -r mount read only (equivalent to '-o ro')\n" - " -o opt,[opt...] mount options\n" - " -h print help\n" + " -d enable debug output (implies -f)\n" + " -f foreground operation\n" + " -s disable multithreaded operation\n" + " -r mount read only (equivalent to '-o ro')\n" + " -o opt,[opt...] mount options\n" + " -h print help\n" "\n" "Mount options:\n" " default_permissions enable permission checking\n" @@ -43,7 +43,8 @@ static void usage(const char *progname) " max_read=N set maximum size of read requests\n" " hard_remove immediate removal (don't hide files)\n" " debug enable debug output\n" - " fsname=NAME set filesystem name in mtab\n"); + " fsname=NAME set filesystem name in mtab\n" + " use_ino let filesystem set inode numbers\n"); } static void invalid_option(const char *argv[], int argctr) diff --git a/util/fusermount.c b/util/fusermount.c index 4f9ed2f..1b79446 100644 --- a/util/fusermount.c +++ b/util/fusermount.c @@ -240,6 +240,7 @@ static int unmount_rename(const char *mnt, int quiet, int lazy, const char *mtab, const char *mtab_new) { int res; + struct stat sbuf; if (getuid() != 0) { res = drop_privs(); @@ -253,6 +254,9 @@ static int unmount_rename(const char *mnt, int quiet, int lazy, if (getuid() != 0) restore_privs(); + if (stat(mtab, &sbuf) == 0) + chown(mtab_new, sbuf.st_uid, sbuf.st_gid); + res = rename(mtab_new, mtab); if (res == -1) { fprintf(stderr, "%s: failed to rename %s to %s: %s\n", progname, @@ -1046,6 +1050,7 @@ int main(int argc, char *argv[]) if (getuid() != 0) restore_privs(); + umask(033); if (unmount) { if (geteuid() == 0) { int mtablock = lock_mtab(); -- 2.30.2