zlib инфляция портится при использовании небольших буферов - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно надуть большие строки с помощью zlib (около 500 КиБ), и я заметил, что при использовании небольшого буфера вывод искажается (случайные буквы преобразуются в гибери sh), но при переключении на большой буфер вывод становится не поврежден.

Это мой код:

                std::string str;
                std::lock_guard<std::mutex> lock(mutex_);

                stream_.next_in = (unsigned char*)deflated.data();
                stream_.avail_in = deflated.size();

                int result = Z_OK;

                do
                {
                    char buffer[1024] = { 0 };

                    stream_.next_out = reinterpret_cast<unsigned char*>(buffer);
                    stream_.avail_out = sizeof(buffer);

                    result = ::inflate(&stream_, Z_NO_FLUSH);

                    str.append(buffer);
                } while (result == Z_OK);

                inflated = std::move(str);

Теперь при 1024 вывод искажается, но если я переключаю его на 256 КиБ (буфер символов [263168]), вывод в порядке. Как я могу решить эту проблему, не переключаясь на такой большой буфер?

1 Ответ

1 голос
/ 30 мая 2020

Если inflate() записывает все 1024 байта в массив char, тогда массив char не будет иметь байта NUL-терминатора, поэтому, когда вы выполняете свой str.append(buffer), то, что добавляется к вашему inflated строка будет состоять из 1024 символов в массиве плюс любые байты мусора, которые окажутся в стеке после массива, пока не встретится первый байт NUL.

Я предлагаю установить stream._avail_out = sizeof(buffer)-1;, чтобы избежать этой проблемы.

...