From 37c5c2fcc83cf7382610d8823a5f45e5066be83b Mon Sep 17 00:00:00 2001 From: Lucjan Bryndza Date: Fri, 8 Jan 2021 17:38:48 +0100 Subject: [PATCH] [EGD-5153] Fix errors in generate image script Script for generate partitions for emulator by mistake overwrites the littlefs image and fatfs image due to the overlap fat parition and littlefs partition Signed-off-by: Lucjan Bryndza --- generate_fatfs_image.sh | 22 +++++++++++++------ .../include/purefs/blkdev/disk_image.hpp | 1 + .../linux/purefs/src/blkdev/disk_image.cpp | 16 +++++++++++--- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/generate_fatfs_image.sh b/generate_fatfs_image.sh index 088abccf906982c492e3415a4dcd045b2babc75c..299da81a225fdcb8a645e0800fc52cd9b87590aa 100755 --- a/generate_fatfs_image.sh +++ b/generate_fatfs_image.sh @@ -57,21 +57,29 @@ if [ -z ${GENLFS} ]; then exit -1 fi +# Partition sizes in sector 512 units +PART1_START=2048 +PART1_SIZE=2097152 +PART2_START=$(($PART1_START + $PART1_SIZE)) +PART2_SIZE=$PART1_SIZE +PART3_START=$(($PART2_START + $PART2_SIZE)) +PART3_SIZE=29358080 + truncate -s 16G $IMAGE_NAME sfdisk $IMAGE_NAME << ==sfdisk label: dos label-id: 0x09650eb4 unit: sectors -/dev/sdx1 : start= 2048, size= 2097152, type=b, bootable -/dev/sdx2 : start= 2099200, size= 2097152, type=b -/dev/sdx3 : start= 4196352, size= 29358080, type=9e +/dev/sdx1 : start= $PART1_START, size= $PART1_SIZE, type=b, bootable +/dev/sdx2 : start= $PART2_START, size= $PART2_SIZE, type=b +/dev/sdx3 : start= $PART3_START, size= $PART3_SIZE, type=9e ==sfdisk -PART1="$IMAGE_NAME@@1048576" -PART2="$IMAGE_NAME@@14604566528" -mformat -i "$PART1" -F -T 28522496 -v MUDITAOS -mformat -i "$PART2" -F -T 2097152 -v RECOVER +PART1="$IMAGE_NAME@@$(($PART1_START*512))" +PART2="$IMAGE_NAME@@$(($PART2_START*512))" +mformat -i "$PART1" -F -T $PART1_SIZE -M 512 -v MUDITAOS +mformat -i "$PART2" -F -T $PART2_SIZE -M 512 -v RECOVER mmd -i "$PART1" ::/current cd "$SRC_DATA" for i in $ASSETS_DIR; do diff --git a/module-vfs/board/linux/purefs/include/purefs/blkdev/disk_image.hpp b/module-vfs/board/linux/purefs/include/purefs/blkdev/disk_image.hpp index adbbc4171d0d6ecec71f5c56201cb1e41eda85ec..aa9c03e54d70ea2d5593c8988868097a377b622c 100644 --- a/module-vfs/board/linux/purefs/include/purefs/blkdev/disk_image.hpp +++ b/module-vfs/board/linux/purefs/include/purefs/blkdev/disk_image.hpp @@ -25,6 +25,7 @@ namespace purefs::blkdev auto status() const -> media_status override; auto get_info(info_type what) const -> scount_t override; auto erase(sector_t lba, std::size_t count) -> int override; + auto range_valid(sector_t lba, std::size_t count) const -> bool; private: int m_filedes{-1}; diff --git a/module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp b/module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp index db67550ae88362395fedb43ecf8a742a7f29a7fc..1248432c24dee1802af2cdc1e63b85097a48edd7 100644 --- a/module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp +++ b/module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp @@ -40,6 +40,9 @@ namespace purefs::blkdev } auto disk_image::write(const void *buf, sector_t lba, std::size_t count) -> int { + if (!range_valid(lba, count)) { + return -ERANGE; + } auto offs = ::lseek(m_filedes, off_t(lba) * sector_size, SEEK_SET); if (offs < 0) { return offs; @@ -58,12 +61,15 @@ namespace purefs::blkdev } auto disk_image::erase(sector_t lba, std::size_t count) -> int { - char buf[count * sector_size]; - std::memset(buf, 0xff, count * sector_size); - return write(buf, lba, count); + std::unique_ptr buf(new char[count * sector_size]); + std::memset(buf.get(), 0xff, count * sector_size); + return write(buf.get(), lba, count); } auto disk_image::read(void *buf, sector_t lba, std::size_t count) -> int { + if (!range_valid(lba, count)) { + return -ERANGE; + } auto offs = ::lseek(m_filedes, off_t(lba) * sector_size, SEEK_SET); if (offs < 0) { return offs; @@ -111,4 +117,8 @@ namespace purefs::blkdev } return -1; } + auto disk_image::range_valid(sector_t lba, std::size_t count) const -> bool + { + return (lba < m_sectors) && ((lba + count) < m_sectors); + } } // namespace purefs::blkdev