diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2015-04-16 16:57:16 +0200 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2015-04-17 10:44:15 +0200 |
commit | adfdd5f3d9d05e6fdf392a5dda824e3e81440636 (patch) | |
tree | f7fff1e482d4cb553832d42ebeba15d9b05f6d32 | |
parent | 49fd854ab23f17b48586bc7d7ed49dc7bd876eed (diff) | |
download | kmsfbwrap-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.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -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; |