From e7dd180447288c27ef087d36b3f56d1b3e9ca58f Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sat, 2 Jul 2022 15:37:09 +0300 Subject: [PATCH] internal/ops: avoid some bounds checks in decode Signed-off-by: Egon Elbre --- internal/ops/ops.go | 3 ++- internal/ops/reader.go | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/ops/ops.go b/internal/ops/ops.go index 3691c272..c68a51ee 100644 --- a/internal/ops/ops.go +++ b/internal/ops/ops.go @@ -163,9 +163,10 @@ const ( ) func (op *ClipOp) Decode(data []byte) { - if OpType(data[0]) != TypeClip { + if len(data) < TypeClipLen || OpType(data[0]) != TypeClip { panic("invalid op") } + data = data[:TypeClipLen] bo := binary.LittleEndian r := image.Rectangle{ Min: image.Point{ diff --git a/internal/ops/reader.go b/internal/ops/reader.go index 63ec9cc3..b7f0f006 100644 --- a/internal/ops/reader.go +++ b/internal/ops/reader.go @@ -160,7 +160,7 @@ func (r *Reader) Decode() (EncodedOp, bool) { } func (op *opMacroDef) decode(data []byte) { - if OpType(data[0]) != TypeMacro { + if len(data) < TypeMacroLen || OpType(data[0]) != TypeMacro { panic("invalid op") } bo := binary.LittleEndian @@ -176,11 +176,11 @@ func (op *opMacroDef) decode(data []byte) { } func (m *macroOp) decode(data []byte, refs []interface{}) { - if OpType(data[0]) != TypeCall { + if len(data) < TypeCallLen || len(refs) < 1 || OpType(data[0]) != TypeCall { panic("invalid op") } - data = data[:TypeCallLen] bo := binary.LittleEndian + data = data[:TypeCallLen] *m = macroOp{ ops: refs[0].(*Ops), start: PC{