diff options
author | Chris Dalton <csmartdalton@google.com> | 2017-12-01 13:11:09 -0700 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-04 14:08:04 +0000 |
commit | 3e794595fdcb90f47e80cd8c69f0a1f09176efa2 (patch) | |
tree | b4fc8f06a039c6f94849d6a863975ce97831ace9 /src/codec/SkJpegPriv.h | |
parent | 8458a2807b4a7220c9849f8032dc611438818641 (diff) |
Fix setjmp/longjump usage in JPEG error handling
Pushes and pops nested jmp_bufs in a stack for proper handling of
nested setjmp calls. Ensures longjmp is never called to a stack frame
that has exited.
Bug: skia:
Change-Id: I18d62504f6e5e3eb53026c3b48617b92ea74b905
Reviewed-on: https://skia-review.googlesource.com/79241
Reviewed-by: Leon Scroggins <scroggo@google.com>
Commit-Queue: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'src/codec/SkJpegPriv.h')
-rw-r--r-- | src/codec/SkJpegPriv.h | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/codec/SkJpegPriv.h b/src/codec/SkJpegPriv.h index e4e5b12763..ce2da56225 100644 --- a/src/codec/SkJpegPriv.h +++ b/src/codec/SkJpegPriv.h @@ -10,6 +10,7 @@ #define SkJpegPriv_DEFINED #include "SkStream.h" +#include "SkTArray.h" #include <setjmp.h> // stdio is needed for jpeglib @@ -30,7 +31,23 @@ static constexpr uint8_t kICCSig[] = { * Error handling struct */ struct skjpeg_error_mgr : jpeg_error_mgr { - jmp_buf fJmpBuf; + class AutoPushJmpBuf { + public: + AutoPushJmpBuf(skjpeg_error_mgr* mgr) : fMgr(mgr) { + fMgr->fJmpBufStack.push_back(&fJmpBuf); + } + ~AutoPushJmpBuf() { + SkASSERT(fMgr->fJmpBufStack.back() == &fJmpBuf); + fMgr->fJmpBufStack.pop_back(); + } + operator jmp_buf&() { return fJmpBuf; } + + private: + skjpeg_error_mgr* const fMgr; + jmp_buf fJmpBuf; + }; + + SkSTArray<4, jmp_buf*> fJmpBufStack; }; #endif |