| Index: core/fxcodec/codec/fx_codec_tiff.cpp
|
| diff --git a/core/fxcodec/codec/fx_codec_tiff.cpp b/core/fxcodec/codec/fx_codec_tiff.cpp
|
| index c76a604e4dc51fd6d53e545de97bde15d8f16e38..c4c745587f31fd7fa3b215f49e3a17f360000746 100644
|
| --- a/core/fxcodec/codec/fx_codec_tiff.cpp
|
| +++ b/core/fxcodec/codec/fx_codec_tiff.cpp
|
| @@ -4,8 +4,11 @@
|
|
|
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
|
|
| +#include <limits>
|
| +
|
| #include "core/fxcodec/codec/codec_int.h"
|
| #include "core/fxcodec/fx_codec.h"
|
| +#include "core/fxcrt/fx_safe_types.h"
|
| #include "core/fxge/fx_dib.h"
|
|
|
| extern "C" {
|
| @@ -29,7 +32,6 @@ class CCodec_TiffContext {
|
| IFX_SeekableReadStream* io_in() const { return m_io_in; }
|
| uint32_t offset() const { return m_offset; }
|
| void set_offset(uint32_t offset) { m_offset = offset; }
|
| - void increment_offset(uint32_t offset) { m_offset += offset; }
|
|
|
| private:
|
| bool IsSupport(const CFX_DIBitmap* pDIBitmap) const;
|
| @@ -89,11 +91,17 @@ TIFFErrorHandler _TIFFerrorHandler = nullptr;
|
| namespace {
|
|
|
| tsize_t tiff_read(thandle_t context, tdata_t buf, tsize_t length) {
|
| - CCodec_TiffContext* pTiffContext = (CCodec_TiffContext*)context;
|
| + CCodec_TiffContext* pTiffContext =
|
| + reinterpret_cast<CCodec_TiffContext*>(context);
|
| + FX_SAFE_UINT32 increment = pTiffContext->offset();
|
| + increment += length;
|
| + if (!increment.IsValid())
|
| + return 0;
|
| +
|
| if (!pTiffContext->io_in()->ReadBlock(buf, pTiffContext->offset(), length))
|
| return 0;
|
|
|
| - pTiffContext->increment_offset(length);
|
| + pTiffContext->set_offset(increment.ValueOrDie());
|
| return length;
|
| }
|
|
|
| @@ -103,24 +111,37 @@ tsize_t tiff_write(thandle_t context, tdata_t buf, tsize_t length) {
|
| }
|
|
|
| toff_t tiff_seek(thandle_t context, toff_t offset, int whence) {
|
| - CCodec_TiffContext* pTiffContext = (CCodec_TiffContext*)context;
|
| + CCodec_TiffContext* pTiffContext =
|
| + reinterpret_cast<CCodec_TiffContext*>(context);
|
| + FX_SAFE_FILESIZE safe_offset = offset;
|
| + if (!safe_offset.IsValid())
|
| + return static_cast<toff_t>(-1);
|
| + FX_FILESIZE file_offset = safe_offset.ValueOrDie();
|
| +
|
| switch (whence) {
|
| - case 0:
|
| - pTiffContext->set_offset(offset);
|
| - break;
|
| - case 1:
|
| - pTiffContext->increment_offset(offset);
|
| - break;
|
| - case 2:
|
| - if (pTiffContext->io_in()->GetSize() < (FX_FILESIZE)offset)
|
| + case 0: {
|
| + if (file_offset > pTiffContext->io_in()->GetSize())
|
| return static_cast<toff_t>(-1);
|
| - pTiffContext->set_offset(pTiffContext->io_in()->GetSize() - offset);
|
| - break;
|
| + pTiffContext->set_offset(file_offset);
|
| + return pTiffContext->offset();
|
| + }
|
| + case 1: {
|
| + FX_SAFE_UINT32 new_increment = pTiffContext->offset();
|
| + new_increment += file_offset;
|
| + if (!new_increment.IsValid())
|
| + return static_cast<toff_t>(-1);
|
| + pTiffContext->set_offset(new_increment.ValueOrDie());
|
| + return pTiffContext->offset();
|
| + }
|
| + case 2: {
|
| + if (pTiffContext->io_in()->GetSize() < file_offset)
|
| + return static_cast<toff_t>(-1);
|
| + pTiffContext->set_offset(pTiffContext->io_in()->GetSize() - file_offset);
|
| + return pTiffContext->offset();
|
| + }
|
| default:
|
| return static_cast<toff_t>(-1);
|
| }
|
| - ASSERT(pTiffContext->offset() <= (uint32_t)pTiffContext->io_in()->GetSize());
|
| - return pTiffContext->offset();
|
| }
|
|
|
| int tiff_close(thandle_t context) {
|
| @@ -128,8 +149,9 @@ int tiff_close(thandle_t context) {
|
| }
|
|
|
| toff_t tiff_get_size(thandle_t context) {
|
| - CCodec_TiffContext* pTiffContext = (CCodec_TiffContext*)context;
|
| - return (toff_t)pTiffContext->io_in()->GetSize();
|
| + CCodec_TiffContext* pTiffContext =
|
| + reinterpret_cast<CCodec_TiffContext*>(context);
|
| + return static_cast<toff_t>(pTiffContext->io_in()->GetSize());
|
| }
|
|
|
| int tiff_map(thandle_t context, tdata_t*, toff_t*) {
|
|
|