diff options
author | 2014-02-05 20:13:58 +0000 | |
---|---|---|
committer | 2014-02-05 20:13:58 +0000 | |
commit | 77cffba66c0f20316580afd25574e47aa49b62bc (patch) | |
tree | 4bbbf5595b704998f310920ee34496d0578a3ff2 /lib/libfuse | |
parent | tweak synopsis: calling ssh-keygen without any arguments is fine; ok jmc@ (diff) | |
download | wireguard-openbsd-77cffba66c0f20316580afd25574e47aa49b62bc.tar.xz wireguard-openbsd-77cffba66c0f20316580afd25574e47aa49b62bc.zip |
check return values in libfuse.
inputs from stsp@.
ok stsp@.
Diffstat (limited to 'lib/libfuse')
-rw-r--r-- | lib/libfuse/fuse.c | 4 | ||||
-rw-r--r-- | lib/libfuse/fuse_ops.c | 242 | ||||
-rw-r--r-- | lib/libfuse/fuse_subr.c | 6 | ||||
-rw-r--r-- | lib/libfuse/tree.c | 7 |
4 files changed, 245 insertions, 14 deletions
diff --git a/lib/libfuse/fuse.c b/lib/libfuse/fuse.c index 6a551f29837..05377df51c5 100644 --- a/lib/libfuse/fuse.c +++ b/lib/libfuse/fuse.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse.c,v 1.18 2013/12/10 10:07:48 syl Exp $ */ +/* $OpenBSD: fuse.c,v 1.19 2014/02/05 20:13:58 syl Exp $ */ /* * Copyright (c) 2013 Sylvestre Gallon <ccna.syl@gmail.com> * @@ -110,7 +110,7 @@ fuse_loop(struct fuse *fuse) ret = ifuse_exec_opcode(fuse, &fbuf); if (ret) { ictx = NULL; - return (ret); + return (-1); } n = write(fuse->fc->fd, &fbuf, sizeof(fbuf)); diff --git a/lib/libfuse/fuse_ops.c b/lib/libfuse/fuse_ops.c index 2f0fdc6bc4a..ed79977f6d0 100644 --- a/lib/libfuse/fuse_ops.c +++ b/lib/libfuse/fuse_ops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse_ops.c,v 1.23 2014/01/29 20:37:18 syl Exp $ */ +/* $OpenBSD: fuse_ops.c,v 1.24 2014/02/05 20:13:58 syl Exp $ */ /* * Copyright (c) 2013 Sylvestre Gallon <ccna.syl@gmail.com> * @@ -110,8 +110,17 @@ ifuse_ops_getattr(struct fuse *f, struct fusebuf *fbuf) bzero(&fbuf->fb_vattr, sizeof(fbuf->fb_vattr)); vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = update_vattr(f, &fbuf->fb_vattr, realname, vn); free(realname); @@ -127,8 +136,17 @@ ifuse_ops_access(struct fuse *f, struct fusebuf *fbuf) CHECK_OPT(access); vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.access(realname, fbuf->fb_io_mode); free(realname); @@ -148,8 +166,17 @@ ifuse_ops_open(struct fuse *f, struct fusebuf *fbuf) ffi.flags = fbuf->fb_io_flags; vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.open(realname, &ffi); free(realname); @@ -173,9 +200,18 @@ ifuse_ops_opendir(struct fuse *f, struct fusebuf *fbuf) ffi.flags = fbuf->fb_io_flags; vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } if (f->op.opendir) { realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.opendir(realname, &ffi); free(realname); } @@ -184,8 +220,10 @@ ifuse_ops_opendir(struct fuse *f, struct fusebuf *fbuf) fbuf->fb_io_fd = ffi.fh; vn->fd = calloc(1, sizeof(*vn->fd)); - if (vn->fd == NULL) - return (errno); + if (vn->fd == NULL) { + fbuf->fb_err = -errno; + return (0); + } vn->fd->filled = 0; vn->fd->size = 0; @@ -285,10 +323,16 @@ ifuse_ops_readdir(struct fuse *f, struct fusebuf *fbuf) fbuf->fb_dat = calloc(1, size); if (fbuf->fb_dat == NULL) { - fbuf->fb_err = errno; + fbuf->fb_err = -errno; return (0); } + vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } if (!vn->fd->filled) { vn->fd->filler = ifuse_fill_readdir; @@ -301,6 +345,12 @@ ifuse_ops_readdir(struct fuse *f, struct fusebuf *fbuf) startsave = vn->fd->start; realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + if (f->op.readdir) fbuf->fb_err = f->op.readdir(realname, vn->fd, ifuse_fill_readdir, offset, &ffi); @@ -342,9 +392,18 @@ ifuse_ops_releasedir(struct fuse *f, struct fusebuf *fbuf) ffi.flags = fbuf->fb_io_flags; vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } if (f->op.releasedir) { realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.releasedir(realname, &ffi); free(realname); } @@ -370,8 +429,16 @@ ifuse_ops_release(struct fuse *f, struct fusebuf *fbuf) ffi.flags = fbuf->fb_io_flags; vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } fbuf->fb_err = f->op.release(realname, &ffi); free(realname); @@ -392,7 +459,7 @@ ifuse_ops_lookup(struct fuse *f, struct fusebuf *fbuf) if (vn == NULL) { vn = alloc_vn(f, (const char *)fbuf->fb_dat, -1, fbuf->fb_ino); if (vn == NULL) { - fbuf->fb_err = -ENOMEM; + fbuf->fb_err = -errno; free(fbuf->fb_dat); return (0); } @@ -401,6 +468,12 @@ ifuse_ops_lookup(struct fuse *f, struct fusebuf *fbuf) DPRINTF("new ino %llu\n", (unsigned long long)vn->ino); realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + fbuf->fb_err = update_vattr(f, &fbuf->fb_vattr, realname, vn); free(fbuf->fb_dat); free(realname); @@ -427,13 +500,24 @@ ifuse_ops_read(struct fuse *f, struct fusebuf *fbuf) fbuf->fb_dat = malloc(size); if (fbuf->fb_dat == NULL) { - fbuf->fb_err = errno; + fbuf->fb_err = -errno; return (0); } vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + ret = f->op.read(realname, (char *)fbuf->fb_dat, size, offset, &ffi); free(realname); if (ret >= 0) @@ -467,8 +551,19 @@ ifuse_ops_write(struct fuse *f, struct fusebuf *fbuf) offset = fbuf->fb_io_off; vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + ret = f->op.write(realname, (char *)fbuf->fb_dat, size, offset, &ffi); free(realname); free(fbuf->fb_dat); @@ -496,10 +591,21 @@ ifuse_ops_create(struct fuse *f, struct fusebuf *fbuf) bzero(&ffi, sizeof(ffi)); ffi.flags = fbuf->fb_io_flags; mode = fbuf->fb_io_mode; + vn = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } free(fbuf->fb_dat); realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + if (f->op.create) fbuf->fb_err = f->op.create(realname, mode, &ffi); else if (f->op.mknod) @@ -528,9 +634,19 @@ ifuse_ops_mkdir(struct fuse *f, struct fusebuf *fbuf) mode = fbuf->fb_io_mode; vn = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } free(fbuf->fb_dat); realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.mkdir(realname, mode); if (!fbuf->fb_err) { @@ -551,9 +667,19 @@ ifuse_ops_rmdir(struct fuse *f, struct fusebuf *fbuf) CHECK_OPT(rmdir); vn = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } free(fbuf->fb_dat); realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.rmdir(realname); free(realname); @@ -572,8 +698,17 @@ ifuse_ops_readlink(struct fuse *f, struct fusebuf *fbuf) DPRINTF("Inode:\t%llu\n", (unsigned long long)fbuf->fb_ino); vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + if (f->op.readlink) ret = f->op.readlink(realname, name, sizeof(name)); else @@ -586,7 +721,7 @@ ifuse_ops_readlink(struct fuse *f, struct fusebuf *fbuf) fbuf->fb_len = len; fbuf->fb_dat = malloc(fbuf->fb_len); if (fbuf->fb_dat == NULL) { - fbuf->fb_err = errno; + fbuf->fb_err = -errno; return (0); } memcpy(fbuf->fb_dat, name, len); @@ -605,9 +740,19 @@ ifuse_ops_unlink(struct fuse *f, struct fusebuf *fbuf) CHECK_OPT(unlink); vn = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); - free(fbuf->fb_dat); + if (vn == NULL) { + free(fbuf->fb_dat); + fbuf->fb_err = -errno; + return (0); + } + free(fbuf->fb_dat); realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.unlink(realname); free(realname); @@ -625,8 +770,17 @@ ifuse_ops_statfs(struct fuse *f, struct fusebuf *fbuf) CHECK_OPT(statfs); vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + return (0); + } realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.statfs(realname, &fbuf->fb_stat); free(realname); @@ -644,10 +798,26 @@ ifuse_ops_link(struct fuse *f, struct fusebuf *fbuf) CHECK_OPT(link); oldnodeid = fbuf->fb_io_ino; vn = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } free(fbuf->fb_dat); realname = build_realname(f, oldnodeid); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + realname_ln = build_realname(f, vn->ino); + if (realname_ln == NULL) { + fbuf->fb_err = -errno; + free(realname); + return (0); + } + fbuf->fb_err = f->op.link(realname, realname_ln); free(realname); free(realname_ln); @@ -670,7 +840,18 @@ ifuse_ops_setattr(struct fuse *f, struct fusebuf *fbuf) DPRINTF("Inode:\t%llu\n", (unsigned long long)fbuf->fb_ino); vn = tree_get(&f->vnode_tree, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } io = fbtod(fbuf, struct fb_io *); if (io->fi_flags & FUSE_FATTR_MODE) { @@ -738,9 +919,21 @@ ifuse_ops_symlink(unused struct fuse *f, struct fusebuf *fbuf) CHECK_OPT(symlink); vn = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + len = strlen((char *)fbuf->fb_dat); realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + /* fuse invert the symlink params */ fbuf->fb_err = f->op.symlink((const char *)&fbuf->fb_dat[len + 1], realname); @@ -764,12 +957,35 @@ ifuse_ops_rename(struct fuse *f, struct fusebuf *fbuf) len = strlen((char *)fbuf->fb_dat); vnf = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); + if (vnf == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + vnt = get_vn_by_name_and_parent(f, &fbuf->fb_dat[len + 1], fbuf->fb_io_ino); + if (vnt == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } + free(fbuf->fb_dat); realnamef = build_realname(f, vnf->ino); + if (realnamef == NULL) { + fbuf->fb_err = -errno; + return (0); + } + realnamet = build_realname(f, vnt->ino); + if (realnamet == NULL) { + fbuf->fb_err = -errno; + free(realnamef); + return (0); + } + fbuf->fb_err = f->op.rename(realnamef, realnamet); free(realnamef); free(realnamet); @@ -822,9 +1038,19 @@ ifuse_ops_mknod(struct fuse *f, struct fusebuf *fbuf) mode = fbuf->fb_io_mode; dev = fbuf->fb_io_rdev; vn = get_vn_by_name_and_parent(f, fbuf->fb_dat, fbuf->fb_ino); + if (vn == NULL) { + fbuf->fb_err = -errno; + free(fbuf->fb_dat); + return (0); + } free(fbuf->fb_dat); realname = build_realname(f, vn->ino); + if (realname == NULL) { + fbuf->fb_err = -errno; + return (0); + } + fbuf->fb_err = f->op.mknod(realname, mode, dev); if (!fbuf->fb_err) { diff --git a/lib/libfuse/fuse_subr.c b/lib/libfuse/fuse_subr.c index 54cb3bd1deb..95ba3293a75 100644 --- a/lib/libfuse/fuse_subr.c +++ b/lib/libfuse/fuse_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse_subr.c,v 1.6 2013/12/03 09:59:40 syl Exp $ */ +/* $OpenBSD: fuse_subr.c,v 1.7 2014/02/05 20:13:58 syl Exp $ */ /* * Copyright (c) 2013 Sylvestre Gallon <ccna.syl@gmail.com> * @@ -124,12 +124,14 @@ get_vn_by_name_and_parent(struct fuse *f, uint8_t *xpath, ino_t parent) vn_head = dict_get(&f->name_tree, path); if (vn_head == NULL) - return (NULL); + goto fail; SIMPLEQ_FOREACH(v, vn_head, node) if (v->parent == parent) return (v); +fail: + errno = ENOENT; return (NULL); } diff --git a/lib/libfuse/tree.c b/lib/libfuse/tree.c index 8050f6da6e9..dccd6e875c3 100644 --- a/lib/libfuse/tree.c +++ b/lib/libfuse/tree.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tree.c,v 1.1 2013/06/03 16:00:50 tedu Exp $ */ +/* $OpenBSD: tree.c,v 1.2 2014/02/05 20:13:58 syl Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> @@ -17,6 +17,7 @@ */ #include <stdlib.h> +#include <errno.h> #include "fuse_private.h" @@ -64,8 +65,10 @@ tree_get(struct tree *t, uint64_t id) struct treeentry key, *entry; key.id = id; - if ((entry = SPLAY_FIND(tree, t, &key)) == NULL) + if ((entry = SPLAY_FIND(tree, t, &key)) == NULL) { + errno = ENOENT; return (NULL); + } return (entry->data); } |