diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2010-11-08 16:06:37 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2010-11-08 16:06:37 +0100 |
commit | 7d878eb13a9b1e0e1a428c1ead2733b8453a3bb7 (patch) | |
tree | dad5d2e465b7a580bc636bcf02c94f6a5175b27a /lib/buffer.c | |
parent | eba226948b44d5a303a10908d440e808eaf0bae6 (diff) | |
download | libfuse-7d878eb13a9b1e0e1a428c1ead2733b8453a3bb7.tar.gz |
Fix fuse_buf_copy() if already at the end of the buffers
Diffstat (limited to 'lib/buffer.c')
-rw-r--r-- | lib/buffer.c | 18 |
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) |