fix(relinker): report buffered output write failures

This commit is contained in:
Darko Gjorgjijoski 2026-09-28 00:25:42 +02:00
parent 7656458121
commit 42594eecd4
3 changed files with 58 additions and 0 deletions

View File

@ -106,6 +106,19 @@ endif()
if(BUILD_TESTING)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_executable(file_writer_tests
${CMAKE_CURRENT_SOURCE_DIR}/io/tests/FileWriterTests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/io/src/FileWriter.cpp
)
target_include_directories(file_writer_tests PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/domain/include
${CMAKE_CURRENT_SOURCE_DIR}/io/include
)
add_test(NAME file_writer_binary COMMAND file_writer_tests binary)
add_test(NAME file_writer_text COMMAND file_writer_tests text)
endif()
add_executable(amd64_only_converter_tests
${CMAKE_CURRENT_SOURCE_DIR}/codegen/tests/Amd64OnlyConverterTests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/codegen/src/Amd64OnlyConverter.cpp

View File

@ -9,6 +9,7 @@ void FileWriter::Write(const std::string& path, const std::vector<std::uint8_t>&
if (!f)
throw Domain::RelinkerException("Cannot open output file: " + path);
f.write(reinterpret_cast<const char*>(data.data()), static_cast<std::streamsize>(data.size()));
f.close();
if (!f)
throw Domain::RelinkerException("Failed to write file: " + path);
}
@ -18,6 +19,7 @@ void FileWriter::Write(const std::string& path, const std::string& content) {
if (!f)
throw Domain::RelinkerException("Cannot open output file: " + path);
f << content;
f.close();
if (!f)
throw Domain::RelinkerException("Failed to write file: " + path);
}

View File

@ -0,0 +1,43 @@
#include <io/FileWriter.hpp>
#include <domain/Types.hpp>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>
namespace {
template<typename TValue>
void requireWriteFailure(const TValue& data) {
Io::FileWriter writer;
writer.Write("/dev/null", data);
try {
writer.Write("/dev/full", data);
} catch (const Domain::RelinkerException& e) {
if (std::string(e.what()) != "Failed to write file: /dev/full")
throw std::runtime_error("Unexpected write failure: " + std::string(e.what()));
return;
}
throw std::runtime_error("Write to /dev/full reported success");
}
}
int main(int argc, char* argv[]) {
try {
if (argc != 2) throw std::runtime_error("Expected binary or text");
const std::string mode = argv[1];
for (const std::size_t size : {std::size_t{3}, std::size_t{65536}}) {
if (mode == "binary")
requireWriteFailure(std::vector<std::uint8_t>(size, 0x41));
else if (mode == "text")
requireWriteFailure(std::string(size, 'A'));
else
throw std::runtime_error("Unknown test mode: " + mode);
}
} catch (const std::exception& e) {
std::cerr << e.what() << '\n';
return 1;
}
return 0;
}