Use AutoRestorer in CPDF_StreamParser::ReadInlineStream() Restore a position value automatically. Then remove a superfluous assignment that the AutoRestorer immediately overwrites, and combine some duplicate code. Change-Id: Icad7451655a2892f9e6dc7d1ee2269b809a1f2e2 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/127853 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org> Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp index 9629663..37cef4a 100644 --- a/core/fpdfapi/page/cpdf_streamparser.cpp +++ b/core/fpdfapi/page/cpdf_streamparser.cpp
@@ -25,6 +25,7 @@ #include "core/fxcodec/data_and_bytes_consumed.h" #include "core/fxcodec/jpeg/jpegmodule.h" #include "core/fxcodec/scanlinedecoder.h" +#include "core/fxcrt/autorestorer.h" #include "core/fxcrt/check.h" #include "core/fxcrt/data_vector.h" #include "core/fxcrt/fx_extension.h" @@ -199,26 +200,20 @@ return nullptr; } - uint32_t saved_position = m_Pos; - m_Pos += stream_size; - while (true) { - uint32_t saved_iteration_position = m_Pos; - ElementType type = ParseNextElement(); - if (type == ElementType::kEndOfData) { - break; - } + { + AutoRestorer<uint32_t> saved_position(&m_Pos); + m_Pos += stream_size; + while (true) { + uint32_t saved_iteration_position = m_Pos; + ElementType type = ParseNextElement(); + if (type == ElementType::kEndOfData || + (type == ElementType::kKeyword && GetWord() == "EI")) { + break; + } - if (type != ElementType::kKeyword) { stream_size += m_Pos - saved_iteration_position; - continue; } - if (GetWord() == "EI") { - m_Pos = saved_iteration_position; - break; - } - stream_size += m_Pos - saved_iteration_position; } - m_Pos = saved_position; auto src_span = m_pBuf.subspan(m_Pos, stream_size); data = DataVector<uint8_t>(src_span.begin(), src_span.end()); m_Pos += stream_size;