Распаковка с Boost Zlib вылетает на Windows - PullRequest
0 голосов
/ 29 марта 2020

Я успешно использую следующий код на Linux, но он падает на boost::iostreams::copy() на Windows. В чем может быть причина?

#include <sstream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

// https://stackoverflow.com/a/17176881/3764804
bool is_compressed(const std::string &data) {
    return data.at(0) == 0x78 && (unsigned char) data.at(1) == 0xDA;
}

std::string compress(const std::string &plain_text) {
    boost::iostreams::filtering_streambuf<boost::iostreams::output> output_stream;
    const auto compression_level = boost::iostreams::zlib::best_compression;
    output_stream.push(boost::iostreams::zlib_compressor(compression_level));
    std::stringstream string_stream;
    output_stream.push(string_stream);
    boost::iostreams::copy(boost::iostreams::basic_array_source<char>(plain_text.c_str(),
                                                                      plain_text.size()), output_stream);
    return string_stream.str();
}

std::string decompress(const std::string &cipher_text) {
    std::stringstream string_stream;
    string_stream << cipher_text;
    boost::iostreams::filtering_streambuf<boost::iostreams::input> input_stream;
    input_stream.push(boost::iostreams::zlib_decompressor());

    input_stream.push(string_stream);
    std::stringstream unpacked_text;
    boost::iostreams::copy(input_stream, unpacked_text); // <-- Crashes here on Windows
    return unpacked_text.str();
}

Исключение:

Exception thrown at 0x00007FFF08A8A859 in my_project.exe: Microsoft C++ exception: boost::wrapexcept<boost::iostreams::zlib_error> at memory location 0x00000015E14FD440.
Exception thrown at 0x00007FFF08A8A859 in my_project.exe: Microsoft C++ exception: [rethrow] at memory location 0x0000000000000000.

My Boost версии 1.72.0.

Я попытался вызвать простой пример сжатия / распаковки в вершина моей основной функции, и это сработало. Однако при использовании большего сжатого буфера все равно происходит сбой.

Этот ответ не относится ко мне, поскольку я пишу в std::stringstream, а не в выходной файл.

1 Ответ

0 голосов
/ 10 апреля 2020

Через несколько дней я обнаружил, что Windows разделители строк 0D 0A записываются в сжатый файл zlib вместо просто 0A на Linux. Это неожиданно вызывает декомпрессию до sh. Простым решением было заменить все 0D 0A последовательностей просто 0A. См. этот вопрос. Тем не менее, я не знаю, почему этот «взлом» необходим. Может быть, есть еще более элегантный способ? Или, может быть, мое решение даже не доказательство. Не стесняйтесь опубликовать другой ответ.

...