diff --git a/src/common/fs_file.cpp b/src/common/fs_file.cpp index 007ec72d4..810345b7d 100644 --- a/src/common/fs_file.cpp +++ b/src/common/fs_file.cpp @@ -36,8 +36,9 @@ bool File::write(std::span data) { return isOpen() && std::fwrite(data.data(), 1, data.size(), m_file) == data.size(); } -bool File::read(void* data, u64 size) const { - return isOpen() && std::fread(data, 1, size, m_file) == size; +bool File::read(void* data, u64 size, u64* bytes_read) const { + *bytes_read = std::fread(data, 1, size, m_file); + return isOpen() && *bytes_read == size; } bool File::seek(s64 offset, SeekMode mode) { diff --git a/src/common/fs_file.h b/src/common/fs_file.h index adc996053..bbefd08e5 100644 --- a/src/common/fs_file.h +++ b/src/common/fs_file.h @@ -30,20 +30,20 @@ class File { bool open(const std::string& path, OpenMode mode = OpenMode::Read); bool close(); - bool read(void* data, u64 size) const; + bool read(void* data, u64 size, u64* bytes_read) const; bool write(std::span data); bool seek(s64 offset, SeekMode mode); u64 getFileSize(); u64 tell() const; template - bool read(T& data) const { - return read(&data, sizeof(T)); + bool read(T& data, u64* bytes_read) const { + return read(&data, sizeof(T),bytes_read); } template - bool read(std::vector& data) const { - return read(data.data(), data.size() * sizeof(T)); + bool read(std::vector& data, u64* bytes_read) const { + return read(data.data(), data.size() * sizeof(T),bytes_read); } bool isOpen() const { diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 729d6b93d..d03f1133a 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp @@ -120,17 +120,18 @@ void Elf::Open(const std::string& file_name) { Reset(); m_f.open(file_name, Common::FS::OpenMode::Read); - m_f.read(m_self); + u64 bytes_read = 0; + m_f.read(m_self, &bytes_read); if (is_self = isSelfFile(); !is_self) { m_f.seek(0, Common::FS::SeekMode::Set); } else { m_self_segments.resize(m_self.segment_count); - m_f.read(m_self_segments); + m_f.read(m_self_segments, &bytes_read); } const u64 elf_header_pos = m_f.tell(); - m_f.read(m_elf_header); + m_f.read(m_elf_header, &bytes_read); if (!isElfFile()) { return; } @@ -142,7 +143,8 @@ void Elf::Open(const std::string& file_name) { out.resize(num); m_f.seek(offset, Common::FS::SeekMode::Set); - m_f.read(out); + u64 bytes_read = 0; + m_f.read(out, &bytes_read); }; load_headers(m_elf_phdr, elf_header_pos + m_elf_header.e_phoff, m_elf_header.e_phnum); @@ -160,7 +162,8 @@ void Elf::Open(const std::string& file_name) { if (m_elf_header.e_ehsize - header_size >= sizeof(elf_program_id_header)) { m_f.seek(header_size, Common::FS::SeekMode::Set); - m_f.read(m_self_id_header); + u64 bytes_read = 0; + m_f.read(m_self_id_header,&bytes_read); } } @@ -412,7 +415,8 @@ void Elf::LoadSegment(u64 virtual_addr, u64 file_offset, u64 size) { if (!is_self) { // It's elf file m_f.seek(file_offset, Common::FS::SeekMode::Set); - m_f.read(reinterpret_cast(static_cast(virtual_addr)), size); + u64 bytes_read = 0; + m_f.read(reinterpret_cast(static_cast(virtual_addr)), size,&bytes_read); return; } @@ -426,7 +430,8 @@ void Elf::LoadSegment(u64 virtual_addr, u64 file_offset, u64 size) { if (file_offset >= phdr.p_offset && file_offset < phdr.p_offset + phdr.p_filesz) { auto offset = file_offset - phdr.p_offset; m_f.seek(offset + seg.file_offset, Common::FS::SeekMode::Set); - m_f.read(reinterpret_cast(static_cast(virtual_addr)), size); + u64 bytes_read = 0; + m_f.read(reinterpret_cast(static_cast(virtual_addr)), size, &bytes_read); return; } }