From 62582723bc97c4a337115d57d81663d9222aaa90 Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Wed, 7 Sep 2022 04:03:49 +1000 Subject: [PATCH] Trim leading and tailing whitespace in base64 string, fixes exception in base64 lib --- src/tmxreader.cpp | 14 +++++++++++--- src/tmxreader.hpp | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/tmxreader.cpp b/src/tmxreader.cpp index d2d0659..d20a39c 100644 --- a/src/tmxreader.cpp +++ b/src/tmxreader.cpp @@ -46,11 +46,19 @@ TmxReader::~TmxReader() } -bool TmxReader::DecodeMap(uint32_t* aOut, size_t aOutSize, const std::string& aStrIn) +bool TmxReader::DecodeMap(uint32_t* aOut, size_t aOutSize, const std::string& aBase64Dat) { + // Cut leading & trailing whitespace (including newlines) + auto beg = std::find_if_not(aBase64Dat.begin(), aBase64Dat.end(), std::isspace); + if (beg == std::end(aBase64Dat)) + return false; + auto end = std::find_if_not(aBase64Dat.rbegin(), aBase64Dat.rend(), std::isspace); + std::size_t begOff = std::distance(std::begin(aBase64Dat), beg); + std::size_t endOff = std::distance(end, std::rend(aBase64Dat)) - begOff; + auto trimmed = aBase64Dat.substr(begOff, endOff); + // Decode base64 string. - size_t cutTheCrap = aStrIn.find_first_not_of(" \t\n\r"); - std::string decoded = base64_decode(aStrIn.substr(cutTheCrap)); + std::string decoded = base64_decode(trimmed); // Decompress compressed data. auto dstSize = static_cast(aOutSize); diff --git a/src/tmxreader.hpp b/src/tmxreader.hpp index edc1696..5baf2eb 100644 --- a/src/tmxreader.hpp +++ b/src/tmxreader.hpp @@ -32,7 +32,7 @@ public: uint32_t LidFromGid(uint32_t aGid); private: - static bool DecodeMap(uint32_t* aOut, size_t aOutSize, const std::string& aStrIn); + static bool DecodeMap(uint32_t* aOut, size_t aOutSize, const std::string& aBase64Dat); void ReadTileset(rapidxml::xml_node<>* aXNode); void ReadLayer(rapidxml::xml_node<>* aXNode); void ReadObjects(rapidxml::xml_node<>* aXNode);