Skip to content

Commit d58c2bf

Browse files
authored
Merge pull request #60 from launchdarkly/prevent-bad-rm
Support array remove with negative index
2 parents f195058 + cda517c commit d58c2bf

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

patch.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -389,17 +389,13 @@ func (d *partialArray) add(key string, val *lazyNode) error {
389389

390390
cur := *d
391391

392-
if idx < 0 {
393-
idx *= -1
394-
395-
if idx > len(ary) {
396-
return fmt.Errorf("Unable to access invalid index: %d", idx)
397-
}
398-
idx = len(ary) - idx
399-
}
400-
if idx < 0 || idx >= len(ary) || idx > len(cur) {
392+
if idx < -len(ary) || idx >= len(ary) {
401393
return fmt.Errorf("Unable to access invalid index: %d", idx)
402394
}
395+
396+
if idx < 0 {
397+
idx += len(ary)
398+
}
403399
copy(ary[0:idx], cur[0:idx])
404400
ary[idx] = val
405401
copy(ary[idx+1:], cur[idx:])
@@ -430,9 +426,12 @@ func (d *partialArray) remove(key string) error {
430426

431427
cur := *d
432428

433-
if idx >= len(cur) {
429+
if idx < -len(cur) || idx >= len(cur) {
434430
return fmt.Errorf("Unable to remove invalid index: %d", idx)
435431
}
432+
if idx < 0 {
433+
idx += len(cur)
434+
}
436435

437436
ary := make([]*lazyNode, len(cur)-1)
438437

patch_test.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,16 @@ var Cases = []Case{
168168
`[ { "op": "copy", "from": "/0/foo/bar", "path": "/0/baz/bar"}]`,
169169
`[ { "baz": {"bar": ["qux","baz"], "qux":"bum"}, "foo": {"bar": ["qux","baz"]}}]`,
170170
},
171+
{
172+
`{ "foo": ["bar","qux","baz"]}`,
173+
`[ { "op": "remove", "path": "/foo/-2"}]`,
174+
`{ "foo": ["bar", "baz"]}`,
175+
},
176+
{
177+
`{ "foo": []}`,
178+
`[ { "op": "add", "path": "/foo/-1", "value": "qux"}]`,
179+
`{ "foo": ["qux"]}`,
180+
},
171181
{
172182
`{ "bar": [{"baz": null}]}`,
173183
`[ { "op": "replace", "path": "/bar/0/baz", "value": 1 } ]`,
@@ -242,7 +252,6 @@ var BadCases = []BadCase{
242252
`{ "foo": ["bar","baz"]}`,
243253
`[ { "op": "add", "path": "/foo/-4", "value": "bum"}]`,
244254
},
245-
246255
{
247256
`{ "name":{ "foo": "bat", "qux": "bum"}}`,
248257
`[ { "op": "replace", "path": "/foo/bar", "value":"baz"}]`,
@@ -252,6 +261,18 @@ var BadCases = []BadCase{
252261
`[ {"op": "add", "path": "/foo/2", "value": "bum"}]`,
253262
},
254263
{
264+
`{ "foo": []}`,
265+
`[ {"op": "remove", "path": "/foo/-"}]`,
266+
},
267+
{
268+
`{ "foo": []}`,
269+
`[ {"op": "remove", "path": "/foo/-1"}]`,
270+
},
271+
{
272+
`{ "foo": ["bar"]}`,
273+
`[ {"op": "remove", "path": "/foo/-2"}]`,
274+
},
275+
{
255276
`{}`,
256277
`[ {"op":null,"path":""} ]`,
257278
},

0 commit comments

Comments
 (0)