aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/images
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/images
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/images')
-rw-r--r--src/images/SkJPEGWriteUtility.cpp5
-rw-r--r--src/images/SkJpegEncoder.cpp9
2 files changed, 10 insertions, 4 deletions
diff --git a/src/images/SkJPEGWriteUtility.cpp b/src/images/SkJPEGWriteUtility.cpp
index aa0d3ec4d9..118662d68d 100644
--- a/src/images/SkJPEGWriteUtility.cpp
+++ b/src/images/SkJPEGWriteUtility.cpp
@@ -60,5 +60,8 @@ void skjpeg_error_exit(j_common_ptr cinfo) {
/* Let the memory manager delete any temp files before we die */
jpeg_destroy(cinfo);
- longjmp(error->fJmpBuf, -1);
+ if (error->fJmpBufStack.empty()) {
+ SK_ABORT("JPEG error with no jmp_buf set.");
+ }
+ longjmp(*error->fJmpBufStack.back(), -1);
}
diff --git a/src/images/SkJpegEncoder.cpp b/src/images/SkJpegEncoder.cpp
index 9fade2449a..1c542a66a7 100644
--- a/src/images/SkJpegEncoder.cpp
+++ b/src/images/SkJpegEncoder.cpp
@@ -40,7 +40,7 @@ public:
jpeg_compress_struct* cinfo() { return &fCInfo; }
- jmp_buf& jmpBuf() { return fErrMgr.fJmpBuf; }
+ skjpeg_error_mgr* errorMgr() { return &fErrMgr; }
transform_scanline_proc proc() const { return fProc; }
@@ -187,7 +187,9 @@ std::unique_ptr<SkEncoder> SkJpegEncoder::Make(SkWStream* dst, const SkPixmap& s
}
std::unique_ptr<SkJpegEncoderMgr> encoderMgr = SkJpegEncoderMgr::Make(dst);
- if (setjmp(encoderMgr->jmpBuf())) {
+
+ skjpeg_error_mgr::AutoPushJmpBuf jmp(encoderMgr->errorMgr());
+ if (setjmp(jmp)) {
return nullptr;
}
@@ -224,7 +226,8 @@ SkJpegEncoder::SkJpegEncoder(std::unique_ptr<SkJpegEncoderMgr> encoderMgr, const
SkJpegEncoder::~SkJpegEncoder() {}
bool SkJpegEncoder::onEncodeRows(int numRows) {
- if (setjmp(fEncoderMgr->jmpBuf())) {
+ skjpeg_error_mgr::AutoPushJmpBuf jmp(fEncoderMgr->errorMgr());
+ if (setjmp(jmp)) {
return false;
}