@@ -254,6 +254,10 @@ func (n *lazyNode) intoDoc() (*partialDoc, error) {
254254
255255err := json .Unmarshal (* n .raw , & n .doc )
256256
257+ if n .doc == nil {
258+ return nil , ErrInvalid
259+ }
260+
257261if err != nil {
258262return nil , err
259263}
@@ -308,6 +312,10 @@ func (n *lazyNode) tryDoc() bool {
308312return false
309313}
310314
315+ if n .doc == nil {
316+ return false
317+ }
318+
311319n .which = eDoc
312320return true
313321}
@@ -327,6 +335,18 @@ func (n *lazyNode) tryAry() bool {
327335return true
328336}
329337
338+ func (n * lazyNode ) isNull () bool {
339+ if n == nil {
340+ return true
341+ }
342+
343+ if n .raw == nil {
344+ return true
345+ }
346+
347+ return bytes .Equal (n .compact (), rawJSONNull )
348+ }
349+
330350func (n * lazyNode ) equal (o * lazyNode ) bool {
331351if n .which == eRaw {
332352if ! n .tryDoc () && ! n .tryAry () {
@@ -446,6 +466,10 @@ func (o Operation) From() (string, error) {
446466
447467func (o Operation ) value () * lazyNode {
448468if obj , ok := o ["value" ]; ok {
469+ // A `null` gets decoded as a nil RawMessage, so let's fix it up here.
470+ if obj == nil {
471+ return newLazyNode (newRawMessage (rawJSONNull ))
472+ }
449473return newLazyNode (obj )
450474}
451475
@@ -798,7 +822,10 @@ func ensurePathExists(pd *container, path string, options *ApplyOptions) error {
798822newNode := newLazyNode (newRawMessage (rawJSONObject ))
799823
800824doc .add (part , newNode , options )
801- doc , _ = newNode .intoDoc ()
825+ doc , err = newNode .intoDoc ()
826+ if err != nil {
827+ return err
828+ }
802829}
803830} else {
804831if isArray (* target .raw ) {
@@ -1005,12 +1032,14 @@ func (p Patch) test(doc *container, op Operation, options *ApplyOptions) error {
10051032return errors .Wrapf (err , "error in test for path: '%s'" , path )
10061033}
10071034
1035+ ov := op .value ()
1036+
10081037if val == nil {
1009- if op . value () == nil || op . value (). raw == nil {
1038+ if ov . isNull () {
10101039return nil
10111040}
10121041return errors .Wrapf (ErrTestFailed , "testing value %s failed" , path )
1013- } else if op . value () == nil {
1042+ } else if ov . isNull () {
10141043return errors .Wrapf (ErrTestFailed , "testing value %s failed" , path )
10151044}
10161045
0 commit comments