qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 10/25] virtiofsd: add fuse_mbuf_iter API


From: Dr. David Alan Gilbert (git)
Subject: [PATCH 10/25] virtiofsd: add fuse_mbuf_iter API
Date: Thu, 24 Oct 2019 12:27:03 +0100

From: Stefan Hajnoczi <address@hidden>

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 <address@hidden>
---
 contrib/virtiofsd/buffer.c      | 28 +++++++++++++++++++
 contrib/virtiofsd/fuse_common.h | 48 +++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+)

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                                            *
  * ----------------------------------------------------------- */
-- 
2.23.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]