diff mbox series

[10/25] virtiofsd: add fuse_mbuf_iter API

Message ID 20191024112718.34657-11-dgilbert@redhat.com
State New
Headers show
Series virtiofs daemon (security) | expand

Commit Message

Dr. David Alan Gilbert Oct. 24, 2019, 11:27 a.m. UTC
From: Stefan Hajnoczi <stefanha@redhat.com>

Introduce an API for consuming bytes from a buffer with size checks.
All FUSE operations will be converted to use this safe API instead of
void *inarg.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 contrib/virtiofsd/buffer.c      | 28 +++++++++++++++++++
 contrib/virtiofsd/fuse_common.h | 48 +++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+)
diff mbox series

Patch

diff --git a/contrib/virtiofsd/buffer.c b/contrib/virtiofsd/buffer.c
index 3c9b443fa0..2a0d123bde 100644
--- a/contrib/virtiofsd/buffer.c
+++ b/contrib/virtiofsd/buffer.c
@@ -316,3 +316,31 @@  ssize_t fuse_buf_copy(struct fuse_bufvec *dstv, struct fuse_bufvec *srcv,
 
 	return copied;
 }
+
+void *fuse_mbuf_iter_advance(struct fuse_mbuf_iter *iter, size_t len)
+{
+	void *ptr;
+
+	if (len > iter->size - iter->pos) {
+		return NULL;
+	}
+
+	ptr = iter->mem + iter->pos;
+	iter->pos += len;
+	return ptr;
+}
+
+const char *fuse_mbuf_iter_advance_str(struct fuse_mbuf_iter *iter)
+{
+	const char *str = iter->mem + iter->pos;
+	size_t remaining = iter->size - iter->pos;
+	size_t i;
+
+	for (i = 0; i < remaining; i++) {
+		if (str[i] == '\0') {
+			iter->pos += i + 1;
+			return str;
+		}
+	}
+	return NULL;
+}
diff --git a/contrib/virtiofsd/fuse_common.h b/contrib/virtiofsd/fuse_common.h
index 2d686b2ac4..b5b6d270fe 100644
--- a/contrib/virtiofsd/fuse_common.h
+++ b/contrib/virtiofsd/fuse_common.h
@@ -760,6 +760,54 @@  size_t fuse_buf_size(const struct fuse_bufvec *bufv);
 ssize_t fuse_buf_copy(struct fuse_bufvec *dst, struct fuse_bufvec *src,
 		      enum fuse_buf_copy_flags flags);
 
+/**
+ * Memory buffer iterator
+ *
+ */
+struct fuse_mbuf_iter {
+	/**
+	 * Data pointer
+	 */
+	void *mem;
+
+	/**
+	 * Total length, in bytes
+	 */
+	size_t size;
+
+	/**
+	 * Offset from start of buffer
+	 */
+	size_t pos;
+};
+
+/* Initialize memory buffer iterator from a fuse_buf */
+#define FUSE_MBUF_ITER_INIT(fbuf) \
+	((struct fuse_mbuf_iter) { \
+		 .mem = fbuf->mem, \
+		 .size = fbuf->size, \
+		 .pos = 0, \
+	})
+
+/**
+ * Consume bytes from a memory buffer iterator
+ *
+ * @param iter memory buffer iterator
+ * @param len number of bytes to consume
+ * @return pointer to start of consumed bytes or
+ *         NULL if advancing beyond end of buffer
+ */
+void *fuse_mbuf_iter_advance(struct fuse_mbuf_iter *iter, size_t len);
+
+/**
+ * Consume a NUL-terminated string from a memory buffer iterator
+ *
+ * @param iter memory buffer iterator
+ * @return pointer to the string or
+ *         NULL if advancing beyond end of buffer or there is no NUL-terminator
+ */
+const char *fuse_mbuf_iter_advance_str(struct fuse_mbuf_iter *iter);
+
 /* ----------------------------------------------------------- *
  * Signal handling					       *
  * ----------------------------------------------------------- */