From d90a7e43028d9859fc0771a11b56379c18b8d7be Mon Sep 17 00:00:00 2001 From: ISSOtm Date: Tue, 4 Oct 2022 13:58:05 +0200 Subject: [PATCH] Terminate RGBGFX when opening a file fails `std::filebuf::open`'s result must be checked, though that's not obvious. --- src/gfx/main.cpp | 4 +++- src/gfx/process.cpp | 36 +++++++++++++++++++++++++++--------- src/gfx/reverse.cpp | 8 ++++++-- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/gfx/main.cpp b/src/gfx/main.cpp index 69e7dd67..c9874344 100644 --- a/src/gfx/main.cpp +++ b/src/gfx/main.cpp @@ -254,7 +254,9 @@ static void registerInput(char const *arg) { */ static std::vector readAtFile(std::string const &path, std::vector &argPool) { std::filebuf file; - file.open(path, std::ios_base::in); + if (!file.open(path, std::ios_base::in)) { + fatal("Error reading @%s: %s", path.c_str(), strerror(errno)); + } static_assert(decltype(file)::traits_type::eof() == EOF, "isblank(char_traits<...>::eof()) is UB!"); diff --git a/src/gfx/process.cpp b/src/gfx/process.cpp index ef27c6f1..d19dc72c 100644 --- a/src/gfx/process.cpp +++ b/src/gfx/process.cpp @@ -625,7 +625,9 @@ static std::tuple, std::vector> static void outputPalettes(std::vector const &palettes) { std::filebuf output; - output.open(options.palettes, std::ios_base::out | std::ios_base::binary); + if (!output.open(options.palettes, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to open \"%s\": %s", options.palettes.c_str(), strerror(errno)); + } for (Palette const &palette : palettes) { for (uint8_t i = 0; i < options.nbColorsPerPal; ++i) { @@ -751,7 +753,9 @@ static void outputTileData(Png const &png, DefaultInitVec const &a std::vector const &palettes, DefaultInitVec const &mappings) { std::filebuf output; - output.open(options.output, std::ios_base::out | std::ios_base::binary); + if (!output.open(options.output, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to open \"%s\": %s", options.output.c_str(), strerror(errno)); + } uint64_t remainingTiles = (png.getWidth() / 8) * (png.getHeight() / 8); if (remainingTiles <= options.trim) { @@ -783,15 +787,21 @@ static void outputMaps(DefaultInitVec const &attrmap, std::optional tilemapOutput, attrmapOutput, palmapOutput; if (!options.tilemap.empty()) { tilemapOutput.emplace(); - tilemapOutput->open(options.tilemap, std::ios_base::out | std::ios_base::binary); + if (!tilemapOutput->open(options.tilemap, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to open \"%s\": %s", options.tilemap.c_str(), strerror(errno)); + } } if (!options.attrmap.empty()) { attrmapOutput.emplace(); - attrmapOutput->open(options.attrmap, std::ios_base::out | std::ios_base::binary); + if (!attrmapOutput->open(options.attrmap, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to open \"%s\": %s", options.attrmap.c_str(), strerror(errno)); + } } if (!options.palmap.empty()) { palmapOutput.emplace(); - palmapOutput->open(options.palmap, std::ios_base::out | std::ios_base::binary); + if (!palmapOutput->open(options.palmap, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to open \"%s\": %s", options.palmap.c_str(), strerror(errno)); + } } uint8_t tileID = 0; @@ -887,7 +897,9 @@ static UniqueTiles dedupTiles(Png const &png, DefaultInitVec &attr static void outputTileData(UniqueTiles const &tiles) { std::filebuf output; - output.open(options.output, std::ios_base::out | std::ios_base::binary); + if (!output.open(options.output, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to create \"%s\": %s", options.output.c_str(), strerror(errno)); + } uint16_t tileID = 0; for (auto iter = tiles.begin(), end = tiles.end() - options.trim; iter != end; ++iter) { @@ -900,7 +912,9 @@ static void outputTileData(UniqueTiles const &tiles) { static void outputTilemap(DefaultInitVec const &attrmap) { std::filebuf output; - output.open(options.tilemap, std::ios_base::out | std::ios_base::binary); + if (!output.open(options.tilemap, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to create \"%s\": %s", options.tilemap.c_str(), strerror(errno)); + } for (AttrmapEntry const &entry : attrmap) { output.sputc(entry.tileID); // The tile ID has already been converted @@ -910,7 +924,9 @@ static void outputTilemap(DefaultInitVec const &attrmap) { static void outputAttrmap(DefaultInitVec const &attrmap, DefaultInitVec const &mappings) { std::filebuf output; - output.open(options.attrmap, std::ios_base::out | std::ios_base::binary); + if (!output.open(options.attrmap, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to create \"%s\": %s", options.attrmap.c_str(), strerror(errno)); + } for (AttrmapEntry const &entry : attrmap) { uint8_t attr = entry.xFlip << 5 | entry.yFlip << 6; @@ -923,7 +939,9 @@ static void outputAttrmap(DefaultInitVec const &attrmap, static void outputPalmap(DefaultInitVec const &attrmap, DefaultInitVec const &mappings) { std::filebuf output; - output.open(options.attrmap, std::ios_base::out | std::ios_base::binary); + if (!output.open(options.attrmap, std::ios_base::out | std::ios_base::binary)) { + fatal("Failed to create \"%s\": %s", options.attrmap.c_str(), strerror(errno)); + } for (AttrmapEntry const &entry : attrmap) { output.sputc(entry.getPalID(mappings)); diff --git a/src/gfx/reverse.cpp b/src/gfx/reverse.cpp index e8e0fa74..f00a6159 100644 --- a/src/gfx/reverse.cpp +++ b/src/gfx/reverse.cpp @@ -147,7 +147,9 @@ void reverse() { }; if (!options.palettes.empty()) { std::filebuf file; - file.open(options.palettes, std::ios::in | std::ios::binary); + if (!file.open(options.palettes, std::ios::in | std::ios::binary)) { + fatal("Failed to open \"%s\": %s", options.palettes.c_str(), strerror(errno)); + } palettes.clear(); std::array buf; // 4 colors @@ -232,7 +234,9 @@ void reverse() { options.verbosePrint(Options::VERB_LOG_ACT, "Writing image...\n"); std::filebuf pngFile; - pngFile.open(options.input, std::ios::out | std::ios::binary); + if (!pngFile.open(options.input, std::ios::out | std::ios::binary)) { + fatal("Failed to create \"%s\": %s", options.input.c_str(), strerror(errno)); + } png_structp png = png_create_write_struct( PNG_LIBPNG_VER_STRING, const_cast(static_cast(options.input.c_str())), pngError,