validate offsetToRestore
Bug: skia:7425 Change-Id: I6451058bc5194853440f08a053fb974bc8f377a2 Reviewed-on: https://skia-review.googlesource.com/95161 Commit-Queue: Mike Reed <reed@google.com> Commit-Queue: Mike Klein <mtklein@chromium.org> Reviewed-by: Mike Klein <mtklein@chromium.org>
This commit is contained in:
parent
6be756b673
commit
539c6f5c92
@ -141,6 +141,12 @@ void SkPicturePlayback::draw(SkCanvas* canvas,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void validate_offsetToRestore(SkReadBuffer* reader, size_t offsetToRestore) {
|
||||||
|
if (offsetToRestore) {
|
||||||
|
reader->validate(SkIsAlign4(offsetToRestore) && offsetToRestore >= reader->offset());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SkPicturePlayback::handleOp(SkReadBuffer* reader,
|
void SkPicturePlayback::handleOp(SkReadBuffer* reader,
|
||||||
DrawType op,
|
DrawType op,
|
||||||
uint32_t size,
|
uint32_t size,
|
||||||
@ -162,9 +168,9 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
|
|||||||
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
||||||
bool doAA = ClipParams_unpackDoAA(packed);
|
bool doAA = ClipParams_unpackDoAA(packed);
|
||||||
size_t offsetToRestore = reader->readInt();
|
size_t offsetToRestore = reader->readInt();
|
||||||
|
validate_offsetToRestore(reader, offsetToRestore);
|
||||||
BREAK_ON_READ_ERROR(reader);
|
BREAK_ON_READ_ERROR(reader);
|
||||||
|
|
||||||
SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset());
|
|
||||||
canvas->clipPath(path, clipOp, doAA);
|
canvas->clipPath(path, clipOp, doAA);
|
||||||
if (canvas->isClipEmpty() && offsetToRestore) {
|
if (canvas->isClipEmpty() && offsetToRestore) {
|
||||||
reader->skip(offsetToRestore - reader->offset());
|
reader->skip(offsetToRestore - reader->offset());
|
||||||
@ -176,9 +182,9 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
|
|||||||
uint32_t packed = reader->readInt();
|
uint32_t packed = reader->readInt();
|
||||||
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
||||||
size_t offsetToRestore = reader->readInt();
|
size_t offsetToRestore = reader->readInt();
|
||||||
|
validate_offsetToRestore(reader, offsetToRestore);
|
||||||
BREAK_ON_READ_ERROR(reader);
|
BREAK_ON_READ_ERROR(reader);
|
||||||
|
|
||||||
SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset());
|
|
||||||
canvas->clipRegion(region, clipOp);
|
canvas->clipRegion(region, clipOp);
|
||||||
if (canvas->isClipEmpty() && offsetToRestore) {
|
if (canvas->isClipEmpty() && offsetToRestore) {
|
||||||
reader->skip(offsetToRestore - reader->offset());
|
reader->skip(offsetToRestore - reader->offset());
|
||||||
@ -191,9 +197,9 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
|
|||||||
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
||||||
bool doAA = ClipParams_unpackDoAA(packed);
|
bool doAA = ClipParams_unpackDoAA(packed);
|
||||||
size_t offsetToRestore = reader->readInt();
|
size_t offsetToRestore = reader->readInt();
|
||||||
|
validate_offsetToRestore(reader, offsetToRestore);
|
||||||
BREAK_ON_READ_ERROR(reader);
|
BREAK_ON_READ_ERROR(reader);
|
||||||
|
|
||||||
SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset());
|
|
||||||
canvas->clipRect(rect, clipOp, doAA);
|
canvas->clipRect(rect, clipOp, doAA);
|
||||||
if (canvas->isClipEmpty() && offsetToRestore) {
|
if (canvas->isClipEmpty() && offsetToRestore) {
|
||||||
reader->skip(offsetToRestore - reader->offset());
|
reader->skip(offsetToRestore - reader->offset());
|
||||||
@ -206,9 +212,9 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
|
|||||||
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
SkClipOp clipOp = ClipParams_unpackRegionOp(reader, packed);
|
||||||
bool doAA = ClipParams_unpackDoAA(packed);
|
bool doAA = ClipParams_unpackDoAA(packed);
|
||||||
size_t offsetToRestore = reader->readInt();
|
size_t offsetToRestore = reader->readInt();
|
||||||
|
validate_offsetToRestore(reader, offsetToRestore);
|
||||||
BREAK_ON_READ_ERROR(reader);
|
BREAK_ON_READ_ERROR(reader);
|
||||||
|
|
||||||
SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset());
|
|
||||||
canvas->clipRRect(rrect, clipOp, doAA);
|
canvas->clipRRect(rrect, clipOp, doAA);
|
||||||
if (canvas->isClipEmpty() && offsetToRestore) {
|
if (canvas->isClipEmpty() && offsetToRestore) {
|
||||||
reader->skip(offsetToRestore - reader->offset());
|
reader->skip(offsetToRestore - reader->offset());
|
||||||
|
Loading…
Reference in New Issue
Block a user