From 975445d16d2e91ed1449c2e510a0198a1fcd72b5 Mon Sep 17 00:00:00 2001 From: Curtis La Graff Date: Fri, 16 Mar 2018 15:10:58 -0400 Subject: [PATCH] add nil-pointer checks to avoid runtime panics Signed-off-by: Curtis La Graff --- patch.go | 20 ++++++++++++++++++++ patch_test.go | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/patch.go b/patch.go index de70dbc..755d8ba 100644 --- a/patch.go +++ b/patch.go @@ -66,6 +66,10 @@ func (n *lazyNode) intoDoc() (*partialDoc, error) { return &n.doc, nil } + if n.raw == nil { + return nil, fmt.Errorf("Unable to unmarshal nil pointer as partial document") + } + err := json.Unmarshal(*n.raw, &n.doc) if err != nil { @@ -81,6 +85,10 @@ func (n *lazyNode) intoAry() (*partialArray, error) { return &n.ary, nil } + if n.raw == nil { + return nil, fmt.Errorf("Unable to unmarshal nil pointer as partial array") + } + err := json.Unmarshal(*n.raw, &n.ary) if err != nil { @@ -94,6 +102,10 @@ func (n *lazyNode) intoAry() (*partialArray, error) { func (n *lazyNode) compact() []byte { buf := &bytes.Buffer{} + if n.raw == nil { + return nil + } + err := json.Compact(buf, *n.raw) if err != nil { @@ -104,6 +116,10 @@ func (n *lazyNode) compact() []byte { } func (n *lazyNode) tryDoc() bool { + if n.raw == nil { + return false + } + err := json.Unmarshal(*n.raw, &n.doc) if err != nil { @@ -115,6 +131,10 @@ func (n *lazyNode) tryDoc() bool { } func (n *lazyNode) tryAry() bool { + if n.raw == nil { + return false + } + err := json.Unmarshal(*n.raw, &n.ary) if err != nil { diff --git a/patch_test.go b/patch_test.go index 40ff5af..c5e69c6 100644 --- a/patch_test.go +++ b/patch_test.go @@ -314,6 +314,24 @@ var TestCases = []TestCase{ true, "", }, + { + `{ "foo": null }`, + `[ { "op": "test", "path": "/foo", "value": null } ]`, + true, + "", + }, + { + `{ "foo": {} }`, + `[ { "op": "test", "path": "/foo", "value": null } ]`, + false, + "/foo", + }, + { + `{ "foo": [] }`, + `[ { "op": "test", "path": "/foo", "value": null } ]`, + false, + "/foo", + }, { `{ "baz/foo": "qux" }`, `[ { "op": "test", "path": "/baz~1foo", "value": "qux"} ]`,