3e794595fd
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>
54 lines
1.1 KiB
C++
54 lines
1.1 KiB
C++
/*
|
|
* Copyright 2017 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
|
|
#ifndef SkJpegPriv_DEFINED
|
|
#define SkJpegPriv_DEFINED
|
|
|
|
#include "SkStream.h"
|
|
#include "SkTArray.h"
|
|
|
|
#include <setjmp.h>
|
|
// stdio is needed for jpeglib
|
|
#include <stdio.h>
|
|
|
|
extern "C" {
|
|
#include "jpeglib.h"
|
|
#include "jerror.h"
|
|
}
|
|
|
|
static constexpr uint32_t kICCMarker = JPEG_APP0 + 2;
|
|
static constexpr uint32_t kICCMarkerHeaderSize = 14;
|
|
static constexpr uint8_t kICCSig[] = {
|
|
'I', 'C', 'C', '_', 'P', 'R', 'O', 'F', 'I', 'L', 'E', '\0',
|
|
};
|
|
|
|
/*
|
|
* Error handling struct
|
|
*/
|
|
struct skjpeg_error_mgr : jpeg_error_mgr {
|
|
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
|