mirror of https://github.com/xemu-project/xemu.git
virtiofsd: add fuse_mbuf_iter API
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>
This commit is contained in:
parent
e17f7a580e
commit
dad157e880
|
@ -267,3 +267,31 @@ ssize_t fuse_buf_copy(struct fuse_bufvec *dstv, struct fuse_bufvec *srcv)
|
||||||
|
|
||||||
return copied;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
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
|
* Signal handling
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exit session on HUP, TERM and INT signals and ignore PIPE signal
|
* Exit session on HUP, TERM and INT signals and ignore PIPE signal
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue