OSDN Git Service

Fix "Operation not permitted" error on reading an empty file.
authorrelan <relan@users.noreply.github.com>
Fri, 25 Jan 2013 17:46:10 +0000 (17:46 +0000)
committerrelan <relan@users.noreply.github.com>
Mon, 24 Aug 2015 05:26:15 +0000 (08:26 +0300)
FUSE read/write ops should return a number of bytes actually read/written
or -errno on error.

fuse/main.c
libexfat/io.c

index 1527347..b939164 100644 (file)
@@ -155,19 +155,25 @@ static int fuse_exfat_release(const char* path, struct fuse_file_info* fi)
 static int fuse_exfat_read(const char* path, char* buffer, size_t size,
                off_t offset, struct fuse_file_info* fi)
 {
+       ssize_t ret;
+
        exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
-       if (exfat_generic_pread(&ef, get_node(fi), buffer, size, offset) != size)
-               return EOF;
-       return size;
+       ret = exfat_generic_pread(&ef, get_node(fi), buffer, size, offset);
+       if (ret < 0)
+               return -EIO;
+       return ret;
 }
 
 static int fuse_exfat_write(const char* path, const char* buffer, size_t size,
                off_t offset, struct fuse_file_info* fi)
 {
+       ssize_t ret;
+
        exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
-       if (exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset) != size)
-               return EOF;
-       return size;
+       ret = exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset);
+       if (ret < 0)
+               return -EIO;
+       return ret;
 }
 
 static int fuse_exfat_unlink(const char* path)
index 1a555b9..4413aaa 100644 (file)
@@ -341,7 +341,7 @@ ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node,
        }
        if (!ef->ro && !ef->noatime)
                exfat_update_atime(node);
-       return size - remainder;
+       return MIN(size, node->size - offset) - remainder;
 }
 
 ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node,