Skip to content

Commit

Permalink
virtiofsd: add fuse_mbuf_iter API
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
  • Loading branch information
stefanhaRH authored and dagrh committed Jan 23, 2020
1 parent e17f7a5 commit dad157e
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 1 deletion.
28 changes: 28 additions & 0 deletions tools/virtiofsd/buffer.c
Expand Up @@ -267,3 +267,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;
}
49 changes: 48 additions & 1 deletion tools/virtiofsd/fuse_common.h
Expand Up @@ -703,10 +703,57 @@ size_t fuse_buf_size(const struct fuse_bufvec *bufv);
*/
ssize_t fuse_buf_copy(struct fuse_bufvec *dst, struct fuse_bufvec *src);

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

/**
* Exit session on HUP, TERM and INT signals and ignore PIPE signal
*
Expand Down

0 comments on commit dad157e

Please sign in to comment.