From 6893176e00b961a14bc91f35146ccc7307bd036c Mon Sep 17 00:00:00 2001 From: relan Date: Sat, 29 Feb 2020 10:13:46 +0300 Subject: [PATCH] Fix comparisons between signed and unsigned values. --- libexfat/io.c | 24 +++++++++++++----------- libexfat/mount.c | 4 ++-- libexfat/node.c | 4 ++-- mkfs/mkexfat.c | 4 ++-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/libexfat/io.c b/libexfat/io.c index b65aa6d..c4d73ed 100644 --- a/libexfat/io.c +++ b/libexfat/io.c @@ -373,26 +373,27 @@ ssize_t exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size, ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, void* buffer, size_t size, off_t offset) { + uint64_t newsize = offset; cluster_t cluster; char* bufp = buffer; off_t lsize, loffset, remainder; if (offset < 0) return -EINVAL; - if (offset >= node->size) + if (newsize >= node->size) return 0; if (size == 0) return 0; - cluster = exfat_advance_cluster(ef, node, offset / CLUSTER_SIZE(*ef->sb)); + cluster = exfat_advance_cluster(ef, node, newsize / CLUSTER_SIZE(*ef->sb)); if (CLUSTER_INVALID(*ef->sb, cluster)) { exfat_error("invalid cluster 0x%x while reading", cluster); return -EIO; } - loffset = offset % CLUSTER_SIZE(*ef->sb); - remainder = MIN(size, node->size - offset); + loffset = newsize % CLUSTER_SIZE(*ef->sb); + remainder = MIN(size, node->size - newsize); while (remainder > 0) { if (CLUSTER_INVALID(*ef->sb, cluster)) @@ -414,12 +415,13 @@ ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, } if (!(node->attrib & EXFAT_ATTRIB_DIR) && !ef->ro && !ef->noatime) exfat_update_atime(node); - return MIN(size, node->size - offset) - remainder; + return MIN(size, node->size - newsize) - remainder; } ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, const void* buffer, size_t size, off_t offset) { + uint64_t newsize = offset; int rc; cluster_t cluster; const char* bufp = buffer; @@ -427,29 +429,29 @@ ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, if (offset < 0) return -EINVAL; - if (offset > node->size) + if (newsize > node->size) { - rc = exfat_truncate(ef, node, offset, true); + rc = exfat_truncate(ef, node, newsize, true); if (rc != 0) return rc; } - if (offset + size > node->size) + if (newsize + size > node->size) { - rc = exfat_truncate(ef, node, offset + size, false); + rc = exfat_truncate(ef, node, newsize + size, false); if (rc != 0) return rc; } if (size == 0) return 0; - cluster = exfat_advance_cluster(ef, node, offset / CLUSTER_SIZE(*ef->sb)); + cluster = exfat_advance_cluster(ef, node, newsize / CLUSTER_SIZE(*ef->sb)); if (CLUSTER_INVALID(*ef->sb, cluster)) { exfat_error("invalid cluster 0x%x while writing", cluster); return -EIO; } - loffset = offset % CLUSTER_SIZE(*ef->sb); + loffset = newsize % CLUSTER_SIZE(*ef->sb); remainder = size; while (remainder > 0) { diff --git a/libexfat/mount.c b/libexfat/mount.c index a22e0f8..53d11c6 100644 --- a/libexfat/mount.c +++ b/libexfat/mount.c @@ -122,7 +122,7 @@ static bool verify_vbr_checksum(const struct exfat* ef, void* sector) { off_t sector_size = SECTOR_SIZE(*ef->sb); uint32_t vbr_checksum; - int i; + size_t i; if (exfat_pread(ef->dev, sector, sector_size, 0) < 0) { @@ -283,7 +283,7 @@ int exfat_mount(struct exfat* ef, const char* spec, const char* options) return -EIO; } if (le64_to_cpu(ef->sb->sector_count) * SECTOR_SIZE(*ef->sb) > - exfat_get_size(ef->dev)) + (uint64_t) exfat_get_size(ef->dev)) { /* this can cause I/O errors later but we don't fail mounting to let user rescue data */ diff --git a/libexfat/node.c b/libexfat/node.c index f4cadf0..5e1274b 100644 --- a/libexfat/node.c +++ b/libexfat/node.c @@ -87,7 +87,7 @@ static int read_entries(struct exfat* ef, struct exfat_node* dir, size = exfat_generic_pread(ef, dir, entries, sizeof(struct exfat_entry[n]), offset); - if (size == sizeof(struct exfat_entry[n])) + if (size == sizeof(struct exfat_entry) * n) return 0; /* success */ if (size == 0) return -ENOENT; @@ -108,7 +108,7 @@ static int write_entries(struct exfat* ef, struct exfat_node* dir, size = exfat_generic_pwrite(ef, dir, entries, sizeof(struct exfat_entry[n]), offset); - if (size == sizeof(struct exfat_entry[n])) + if (size == sizeof(struct exfat_entry) * n) return 0; /* success */ if (size < 0) return -EIO; diff --git a/mkfs/mkexfat.c b/mkfs/mkexfat.c index e89e8d7..cd527f6 100644 --- a/mkfs/mkexfat.c +++ b/mkfs/mkexfat.c @@ -52,7 +52,7 @@ static int check_size(off_t volume_size) } static int erase_object(struct exfat_dev* dev, const void* block, - size_t block_size, off_t start, off_t size) + off_t block_size, off_t start, off_t size) { const off_t block_count = DIV_ROUND_UP(size, block_size); off_t i; @@ -78,7 +78,7 @@ static int erase(struct exfat_dev* dev) { const struct fs_object** pp; off_t position = 0; - const size_t block_size = 1024 * 1024; + const off_t block_size = 1024 * 1024; void* block = malloc(block_size); if (block == NULL) -- 2.11.0