diff --git a/libqpdf/Pl_Base64.cc b/libqpdf/Pl_Base64.cc index c9edc42..fbdbef1 100644 --- a/libqpdf/Pl_Base64.cc +++ b/libqpdf/Pl_Base64.cc @@ -39,14 +39,7 @@ Pl_Base64::Pl_Base64(char const* identifier, Pipeline* next, action_e action) : void Pl_Base64::write(unsigned char const* data, size_t len) { - if (finished) { - throw std::logic_error("Pl_Base64 used after finished"); - } - if (action == a_decode) { - decode(data, len); - } else { - encode(data, len); - } + in_buffer.append(reinterpret_cast(data), len); } void @@ -57,7 +50,7 @@ Pl_Base64::decode(unsigned char const* data, size_t len) if (!util::is_space(to_c(*p))) { buf[pos++] = *p; if (pos == 4) { - flush(); + flush_decode(); } } ++p; @@ -72,7 +65,7 @@ Pl_Base64::encode(unsigned char const* data, size_t len) while (len > 0) { buf[pos++] = *p; if (pos == 3) { - flush(); + flush_encode(); } ++p; --len; @@ -80,17 +73,6 @@ Pl_Base64::encode(unsigned char const* data, size_t len) } void -Pl_Base64::flush() -{ - if (action == a_decode) { - flush_decode(); - } else { - flush_encode(); - } - reset(); -} - -void Pl_Base64::flush_decode() { if (end_of_data) { @@ -129,6 +111,7 @@ Pl_Base64::flush_decode() }; next()->write(out, QIntC::to_size(3 - pad)); + reset(); } void @@ -162,23 +145,28 @@ Pl_Base64::flush_encode() out[3 - i] = '='; } next()->write(out, 4); + reset(); } void Pl_Base64::finish() { - if (pos > 0) { - if (finished) { - throw std::logic_error("Pl_Base64 used after finished"); - } - if (action == a_decode) { + if (action == a_decode) { + decode(reinterpret_cast(in_buffer.data()), in_buffer.size()); + if (pos > 0) { for (size_t i = pos; i < 4; ++i) { buf[i] = '='; } + flush_decode(); + } + } else { + encode(reinterpret_cast(in_buffer.data()), in_buffer.size()); + if (pos > 0) { + flush_encode(); } - flush(); } - finished = true; + in_buffer.clear(); + in_buffer.shrink_to_fit(); next()->finish(); } diff --git a/libqpdf/qpdf/Pl_Base64.hh b/libqpdf/qpdf/Pl_Base64.hh index 1abee88..30cbff3 100644 --- a/libqpdf/qpdf/Pl_Base64.hh +++ b/libqpdf/qpdf/Pl_Base64.hh @@ -15,7 +15,6 @@ class Pl_Base64 final: public Pipeline private: void decode(unsigned char const* buf, size_t len); void encode(unsigned char const* buf, size_t len); - void flush(); void flush_decode(); void flush_encode(); void reset(); @@ -23,6 +22,7 @@ class Pl_Base64 final: public Pipeline action_e action; unsigned char buf[4]{0, 0, 0, 0}; size_t pos{0}; + std::string in_buffer; bool end_of_data{false}; bool finished{false}; };