diff options
author | Ryan Harrison <rharrison@chromium.org> | 2018-04-25 21:29:44 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-04-25 21:29:44 +0000 |
commit | 2456bbcbf51ed82ae9ce2836619bbebc5b926976 (patch) | |
tree | 32d8b9899386a4c55bcfbcefacda06b811edc9e9 /core/fxcodec/gif | |
parent | 67e3dd3c7b98a4e69d1fe2a7451bbb19ebb74eb1 (diff) | |
download | pdfium-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>
Diffstat (limited to 'core/fxcodec/gif')
-rw-r--r-- | core/fxcodec/gif/cfx_gifcontext.cpp | 4 | ||||
-rw-r--r-- | core/fxcodec/gif/cfx_gifcontext.h | 1 |
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_; |