From 37aee3901cf6ab36aeb3dae6a2a91a171cec0526 Mon Sep 17 00:00:00 2001 From: Lucjan Bryndza Date: Mon, 11 Jan 2021 12:08:05 +0100 Subject: [PATCH] [EGD-5165] Fix emulator crash on lfs and fat Disk access was not protected by the mutex and race contition occurs when multiple access was made for lfs and fat. Signed-off-by: Lucjan Bryndza --- board/linux/libiosyscalls/include/iosyscalls.hpp | 2 +- board/linux/libiosyscalls/src/iosyscalls.cpp | 2 +- .../bootconfig/include/boot/bootconstants.hpp | 2 +- .../purefs/include/purefs/blkdev/disk_image.hpp | 2 ++ .../board/linux/purefs/src/blkdev/disk_image.cpp | 13 ++++++++++--- .../rt1051/purefs/src/vfs_subsystem_internal.cpp | 2 +- 6 files changed, 16 insertions(+), 7 deletions(-) diff --git a/board/linux/libiosyscalls/include/iosyscalls.hpp b/board/linux/libiosyscalls/include/iosyscalls.hpp index 0acfaec1c1fcb6ce47c87f640ad04166ab294eeb..691682906e65ef58eb0c2339ac31e5149bc326db 100644 --- a/board/linux/libiosyscalls/include/iosyscalls.hpp +++ b/board/linux/libiosyscalls/include/iosyscalls.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once diff --git a/board/linux/libiosyscalls/src/iosyscalls.cpp b/board/linux/libiosyscalls/src/iosyscalls.cpp index 02bfd8baec25a5a7c3aa12ab16a41776633bcd76..1b72f9f074d0a0de481447c42923d804c8d0d647 100644 --- a/board/linux/libiosyscalls/src/iosyscalls.cpp +++ b/board/linux/libiosyscalls/src/iosyscalls.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include diff --git a/module-utils/bootconfig/include/boot/bootconstants.hpp b/module-utils/bootconfig/include/boot/bootconstants.hpp index 770f99b0832ac5ba0de28b7a506b9df18d75e1f5..e8be5ae85929127c96851eadd30c764516c035c4 100644 --- a/module-utils/bootconfig/include/boot/bootconstants.hpp +++ b/module-utils/bootconfig/include/boot/bootconstants.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once 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 aa9c03e54d70ea2d5593c8988868097a377b622c..b13411fa716e846d957500e8cec021f87a379348 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 @@ -4,6 +4,7 @@ #pragma once #include +#include namespace purefs::blkdev { @@ -31,5 +32,6 @@ namespace purefs::blkdev int m_filedes{-1}; unsigned long m_sectors{0}; std::string m_image_name; + mutable std::recursive_mutex m_mtx; }; } // namespace purefs::blkdev 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 1248432c24dee1802af2cdc1e63b85097a48edd7..3c73844cf0e56cacd38a9ff3ec767c8635872039 100644 --- a/module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp +++ b/module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp @@ -15,6 +15,7 @@ namespace purefs::blkdev auto disk_image::probe(unsigned int flags) -> int { + std::lock_guard m_lock(m_mtx); m_filedes = ::open(m_image_name.c_str(), O_RDWR, O_SYNC); if (!m_filedes) return m_filedes; @@ -24,10 +25,11 @@ namespace purefs::blkdev return -errno; } m_sectors = fst.st_size / sector_size; - return 0; + return fst.st_size % sector_size; } auto disk_image::cleanup() -> int { + std::lock_guard m_lock(m_mtx); int ret{-EBADFD}; if (m_filedes) { if (m_filedes) { @@ -40,10 +42,11 @@ namespace purefs::blkdev } auto disk_image::write(const void *buf, sector_t lba, std::size_t count) -> int { + std::lock_guard m_lock(m_mtx); if (!range_valid(lba, count)) { return -ERANGE; } - auto offs = ::lseek(m_filedes, off_t(lba) * sector_size, SEEK_SET); + auto offs = ::lseek64(m_filedes, off64_t(lba) * off64_t(sector_size), SEEK_SET); if (offs < 0) { return offs; } @@ -67,10 +70,11 @@ namespace purefs::blkdev } auto disk_image::read(void *buf, sector_t lba, std::size_t count) -> int { + std::lock_guard m_lock(m_mtx); if (!range_valid(lba, count)) { return -ERANGE; } - auto offs = ::lseek(m_filedes, off_t(lba) * sector_size, SEEK_SET); + auto offs = ::lseek64(m_filedes, off64_t(lba) * off64_t(sector_size), SEEK_SET); if (offs < 0) { return offs; } @@ -88,6 +92,7 @@ namespace purefs::blkdev } auto disk_image::sync() -> int { + std::lock_guard m_lock(m_mtx); int ret{-EBADFD}; if (m_filedes) { ret = fsync(m_filedes); @@ -98,6 +103,7 @@ namespace purefs::blkdev } auto disk_image::status() const -> media_status { + std::lock_guard m_lock(m_mtx); struct stat st; auto ret = ::stat(m_image_name.c_str(), &st); if (!ret) @@ -107,6 +113,7 @@ namespace purefs::blkdev } auto disk_image::get_info(info_type what) const -> scount_t { + std::lock_guard m_lock(m_mtx); switch (what) { case info_type::sector_size: return sector_size; diff --git a/module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp b/module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp index d6225aef9be9e9eb71cc3cc4f39f22a32ccbf061..9582b4bf0815f8c071fd55b7e3e08987df9d355f 100644 --- a/module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp +++ b/module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include