summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Harrison <rharrison@chromium.org>2018-04-25 21:29:44 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-04-25 21:29:44 +0000
commit2456bbcbf51ed82ae9ce2836619bbebc5b926976 (patch)
tree32d8b9899386a4c55bcfbcefacda06b811edc9e9
parent67e3dd3c7b98a4e69d1fe2a7451bbb19ebb74eb1 (diff)
downloadpdfium-2456bbcbf51ed82ae9ce2836619bbebc5b926976.tar.xz
Don't store CE (comment extension) block data when decoding GIF
GIF extensions are laid out as follows: <size byte> <chunk of data> <size byte> <chunk of data> ... <terminator byte>. The decoder needs to scan along the data, finding the size bytes to determine where the block ends in the stream, even if we don't care about the content. Currently the decoder is storing all of the data chunks, which are never used and take a lot of time to concat together if they are very small. Our implementation of the GIF spec does not handle this extension, so when scanning for the end of the block, just don't bother storing data from it. BUG=chromium:833168 Change-Id: Iadf3ab3afd8145b6c5c7c22c30fe9316efcafc15 Reviewed-on: https://pdfium-review.googlesource.com/31315 Commit-Queue: Ryan Harrison <rharrison@chromium.org> Reviewed-by: Henrique Nakashima <hnakashima@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
-rw-r--r--core/fxcodec/gif/cfx_gifcontext.cpp4
-rw-r--r--core/fxcodec/gif/cfx_gifcontext.h1
2 files changed, 0 insertions, 5 deletions
diff --git a/core/fxcodec/gif/cfx_gifcontext.cpp b/core/fxcodec/gif/cfx_gifcontext.cpp
index 66e316b951..3bc9546f70 100644
--- a/core/fxcodec/gif/cfx_gifcontext.cpp
+++ b/core/fxcodec/gif/cfx_gifcontext.cpp
@@ -436,15 +436,11 @@ CFX_GifDecodeStatus CFX_GifContext::DecodeExtension() {
return CFX_GifDecodeStatus::Unfinished;
}
- cmt_data_.clear();
while (*data_size != GIF_BLOCK_TERMINAL) {
- uint8_t block_size = *data_size;
if (!ReadData(&data_buf, *data_size) || !ReadData(&data_size, 1)) {
skip_size_ = skip_size_org;
return CFX_GifDecodeStatus::Unfinished;
}
-
- cmt_data_ += ByteString(data_buf, block_size);
}
break;
}
diff --git a/core/fxcodec/gif/cfx_gifcontext.h b/core/fxcodec/gif/cfx_gifcontext.h
index ba23522b79..597af73764 100644
--- a/core/fxcodec/gif/cfx_gifcontext.h
+++ b/core/fxcodec/gif/cfx_gifcontext.h
@@ -52,7 +52,6 @@ class CFX_GifContext : public CCodec_GifModule::Context {
uint32_t avail_in_;
int32_t decode_status_;
uint32_t skip_size_;
- ByteString cmt_data_;
std::unique_ptr<CFX_GifGraphicControlExtension> graphic_control_extension_;
uint8_t* next_in_;
std::vector<std::unique_ptr<CFX_GifImage>> images_;