aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/images
diff options
context:
space:
mode:
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;
}