Change memcpy to memmove. If an inode is large (>16K) it will cause the src and dest pointers to overlap in the data cache memcpy, potentially leading to block_list corruption/truncation. http://squashfs.cvs.sourceforge.net/viewvc/squashfs/squashfs/squashfs-tools/mksquashfs.c?r1=1.196&r2=1.197 https://github.com/plougher/squashfs-tools/commit/cc909d387484cd88318ded49030a7ceac61c40e5 --- squashfs-tools/mksquashfs.c +++ squashfs-tools/mksquashfs.c @@ -887,7 +887,7 @@ *((unsigned char *)(inode_table + inode_bytes + block_offset - 1)) = SQUASHFS_MARKER_BYTE; inode_bytes += SQUASHFS_COMPRESSED_SIZE(c_byte) + block_offset; total_inode_bytes += SQUASHFS_METADATA_SIZE + block_offset; - memcpy(data_cache, data_cache + SQUASHFS_METADATA_SIZE, cache_bytes - SQUASHFS_METADATA_SIZE); + memmove(data_cache, data_cache + SQUASHFS_METADATA_SIZE, cache_bytes - SQUASHFS_METADATA_SIZE); cache_bytes -= SQUASHFS_METADATA_SIZE; } @@ -1400,7 +1400,7 @@ *((unsigned char *)(directory_table + directory_bytes + block_offset - 1)) = SQUASHFS_MARKER_BYTE; directory_bytes += SQUASHFS_COMPRESSED_SIZE(c_byte) + block_offset; total_directory_bytes += SQUASHFS_METADATA_SIZE + block_offset; - memcpy(directory_data_cache, directory_data_cache + SQUASHFS_METADATA_SIZE, directory_cache_bytes - SQUASHFS_METADATA_SIZE); + memmove(directory_data_cache, directory_data_cache + SQUASHFS_METADATA_SIZE, directory_cache_bytes - SQUASHFS_METADATA_SIZE); directory_cache_bytes -= SQUASHFS_METADATA_SIZE; }