From 209ccd6726c703cbe56209d3fcb3ba9bcf68f1fc Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 16 Dec 2023 17:49:31 -0800 Subject: [PATCH] switch text transcoder error case --- src/Text.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Text.cc b/src/Text.cc index 89fb3655..1dcf2f01 100644 --- a/src/Text.cc +++ b/src/Text.cc @@ -84,8 +84,8 @@ string TextTranscoder::operator()(const void* src, size_t src_size) { const void* orig_src = src; deque blocks; while (src_size > 0) { - // Assume 2x input size on average, but always allocate at least 4 bytes - string& block = blocks.emplace_back(max((src_size << 2), 4), '\0'); + // Assume 2x input size on average, but always allocate at least 8 bytes + string& block = blocks.emplace_back(max((src_size << 1), 8), '\0'); char* dest = block.data(); size_t dest_size = block.size(); size_t ret = iconv( @@ -95,11 +95,6 @@ string TextTranscoder::operator()(const void* src, size_t src_size) { reinterpret_cast(&dest), &dest_size); block.resize(block.size() - dest_size); - if (block.size() == 0) { - // This should never happen because no character should be more than 4 - // bytes long in any known encoding - throw runtime_error("block size too small for conversion"); - } size_t bytes_read = reinterpret_cast(src) - reinterpret_cast(orig_src); if (ret == this->FAILURE_RESULT) { @@ -114,6 +109,9 @@ string TextTranscoder::operator()(const void* src, size_t src_size) { throw runtime_error("transcoding failed: " + string_for_error(errno)); } } + if ((bytes_read == 0) && (src_size != 0)) { + throw runtime_error("failed to transcode input data"); + } } return join(blocks, "");