aboutsummaryrefslogtreecommitdiff
path: root/lib/buffer.c
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2010-11-08 16:06:37 +0100
committerGravatar Miklos Szeredi <mszeredi@suse.cz>2010-11-08 16:06:37 +0100
commit7d878eb13a9b1e0e1a428c1ead2733b8453a3bb7 (patch)
treedad5d2e465b7a580bc636bcf02c94f6a5175b27a /lib/buffer.c
parenteba226948b44d5a303a10908d440e808eaf0bae6 (diff)
Fix fuse_buf_copy() if already at the end of the buffers
Diffstat (limited to 'lib/buffer.c')
-rw-r--r--lib/buffer.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/buffer.c b/lib/buffer.c
index 8940edd..0006cbf 100644
--- a/lib/buffer.c
+++ b/lib/buffer.c
@@ -232,7 +232,10 @@ static ssize_t fuse_buf_copy_one(const struct fuse_buf *dst, size_t dst_off,
static const struct fuse_buf *fuse_bufvec_current(struct fuse_bufvec *bufv)
{
- return &bufv->buf[bufv->idx];
+ if (bufv->idx < bufv->count)
+ return &bufv->buf[bufv->idx];
+ else
+ return NULL;
}
static int fuse_bufvec_advance(struct fuse_bufvec *bufv, size_t len)
@@ -259,11 +262,18 @@ ssize_t fuse_buf_copy(struct fuse_bufvec *dstv, struct fuse_bufvec *srcv,
for (;;) {
const struct fuse_buf *src = fuse_bufvec_current(srcv);
const struct fuse_buf *dst = fuse_bufvec_current(dstv);
- size_t src_len = src->size - srcv->off;
- size_t dst_len = dst->size - dstv->off;
- size_t len = min_size(src_len, dst_len);
+ size_t src_len;
+ size_t dst_len;
+ size_t len;
ssize_t res;
+ if (src == NULL || dst == NULL)
+ break;
+
+ src_len = src->size - srcv->off;
+ dst_len = dst->size - dstv->off;
+ len = min_size(src_len, dst_len);
+
res = fuse_buf_copy_one(dst, dstv->off, src, srcv->off, len, flags);
if (res < 0) {
if (!copied)