diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-11-22 21:22:12 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-11-23 09:56:24 +0100 |
commit | 875a7a3351488ac18b6576793ffe5d54b57fdfe0 (patch) | |
tree | 619bc4c8d24efe7b17ddb476a23aeb2e32092709 /vcl/source | |
parent | 5c85fc8552e8ce811833351b68b3d70b9bb6bf4f (diff) |
ofz#53628 Use a progress monitor to avoid Timeout
LJT-01-003 of https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf
Change-Id: I834e0891c4bb91907750282a26b8b803f94b8fb0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143131
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/source')
-rw-r--r-- | vcl/source/filter/jpeg/jpegc.cxx | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/vcl/source/filter/jpeg/jpegc.cxx b/vcl/source/filter/jpeg/jpegc.cxx index 2b2f9713a695..a3ce069cccf7 100644 --- a/vcl/source/filter/jpeg/jpegc.cxx +++ b/vcl/source/filter/jpeg/jpegc.cxx @@ -150,6 +150,7 @@ private: struct JpegStuff { jpeg_decompress_struct cinfo; + jpeg_progress_mgr progress; ErrorManagerStruct jerr; JpegDecompressOwner aOwner; std::unique_ptr<BitmapScopedWriteAccess> pScopedAccess; @@ -157,6 +158,23 @@ struct JpegStuff std::vector<sal_uInt8> pCYMKBuffer; }; +// https://github.com/libjpeg-turbo/libjpeg-turbo/issues/284 +// https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf +#define LIMITSCANS 100 + +void progress_monitor(j_common_ptr cinfo) +{ + if (cinfo->is_decompressor) + { + jpeg_decompress_struct* decompressor = reinterpret_cast<j_decompress_ptr>(cinfo); + if (decompressor->input_scan_number >= LIMITSCANS) + { + SAL_WARN("vcl.filter", "too many progressive scans, cancelling import after: " << decompressor->input_scan_number << " scans"); + errorExit(cinfo); + } + } +} + } static void ReadJPEG(JpegStuff& rContext, JPEGReader* pJPEGReader, void* pInputStream, tools::Long* pLines, @@ -176,6 +194,8 @@ static void ReadJPEG(JpegStuff& rContext, JPEGReader* pJPEGReader, void* pInputS jpeg_create_decompress(&rContext.cinfo); rContext.aOwner.set(&rContext.cinfo); jpeg_svstream_src(&rContext.cinfo, pInputStream); + rContext.cinfo.progress = &rContext.progress; + rContext.progress.progress_monitor = progress_monitor; SourceManagerStruct *source = reinterpret_cast<SourceManagerStruct*>(rContext.cinfo.src); jpeg_read_header(&rContext.cinfo, TRUE); |