summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2015-04-16 16:57:16 +0200
committerPhilipp Zabel <p.zabel@pengutronix.de>2015-04-17 10:44:15 +0200
commitadfdd5f3d9d05e6fdf392a5dda824e3e81440636 (patch)
treef7fff1e482d4cb553832d42ebeba15d9b05f6d32
parent49fd854ab23f17b48586bc7d7ed49dc7bd876eed (diff)
downloadkmsfbwrap-adfdd5f3d9d05e6fdf392a5dda824e3e81440636.tar.gz
kmsfbwrap-adfdd5f3d9d05e6fdf392a5dda824e3e81440636.tar.xz
bgi: fix read/write for block size >= 128k
CUSE splits reads and writes with buffer sizes >= 128k. The buf and size parameters given to the read and write callbacks are the partial buffer. ofs is the offset into the original buffer and must not be added to buf. Since we are memory backed, we can just ignore it. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--src/bgi.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/bgi.c b/src/bgi.c
index b0ed349..9a88aa0 100644
--- a/src/bgi.c
+++ b/src/bgi.c
@@ -41,9 +41,11 @@ static void fbdev_read(fuse_req_t req, size_t size, off_t off,
int start;
void *buf;
- start = fb->pos + off;
+ start = fb->pos;
- if (start + size > fb->fb_fix.smem_len)
+ if (start >= fb->fb_fix.smem_len)
+ size = 0;
+ else if (start + size > fb->fb_fix.smem_len)
size = fb->fb_fix.smem_len - start;
buf = malloc(size);
@@ -59,9 +61,11 @@ static void fbdev_write(fuse_req_t req, const char *buf, size_t size,
struct kms_fb *fb = fuse_req_userdata(req);
int start;
- start = fb->pos + off;
+ start = fb->pos;
- if (start + size > fb->fb_fix.smem_len)
+ if (start >= fb->fb_fix.smem_len)
+ size = 0;
+ else if (start + size > fb->fb_fix.smem_len)
size = fb->fb_fix.smem_len - start;
if (size == 0) {
@@ -69,7 +73,7 @@ static void fbdev_write(fuse_req_t req, const char *buf, size_t size,
return;
}
- memcpy(fb->fb + start, buf + off, size);
+ memcpy(fb->fb + start, buf, size);
fuse_reply_write(req, size);
fb->pos += size;