aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkJpegPriv.h
diff options
context:
space:
mode:
authorGravatar Chris Dalton <csmartdalton@google.com>2017-12-01 13:11:09 -0700
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-04 14:08:04 +0000
commit3e794595fdcb90f47e80cd8c69f0a1f09176efa2 (patch)
treeb4fc8f06a039c6f94849d6a863975ce97831ace9 /src/codec/SkJpegPriv.h
parent8458a2807b4a7220c9849f8032dc611438818641 (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.h19
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