summaryrefslogtreecommitdiffstats
path: root/lib/libfuse
diff options
context:
space:
mode:
authorsyl <syl@openbsd.org>2014-02-05 20:13:58 +0000
committersyl <syl@openbsd.org>2014-02-05 20:13:58 +0000
commit77cffba66c0f20316580afd25574e47aa49b62bc (patch)
tree4bbbf5595b704998f310920ee34496d0578a3ff2 /lib/libfuse
parenttweak synopsis: calling ssh-keygen without any arguments is fine; ok jmc@ (diff)
downloadwireguard-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.c4
-rw-r--r--lib/libfuse/fuse_ops.c242
-rw-r--r--lib/libfuse/fuse_subr.c6
-rw-r--r--lib/libfuse/tree.c7
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);
}