Skip to content

Commit c6db9f2

Browse files
Copilotziflex
andcommitted
Fix ArrayIterator and ObjectIterator bounds checking
Co-authored-by: ziflex <1607148+ziflex@users.noreply.github.com>
1 parent 0f2f030 commit c6db9f2

3 files changed

Lines changed: 28 additions & 9 deletions

File tree

pkg/runtime/array_iter.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ func (iter *ArrayIterator) HasNext(_ context.Context) (bool, error) {
1919
}
2020

2121
func (iter *ArrayIterator) Next(_ context.Context) (value Value, key Value, err error) {
22+
if iter.pos >= iter.length {
23+
return None, None, Error(ErrInvalidOperation, "no more elements")
24+
}
25+
26+
value = iter.values.data[iter.pos]
27+
key = NewInt(iter.pos)
2228
iter.pos++
2329

24-
return iter.values.data[iter.pos-1], NewInt(iter.pos - 1), nil
30+
return
2531
}

pkg/runtime/helpers.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,12 @@ func ToFloat(ctx context.Context, input Value) (Float, error) {
361361

362362
res := ZeroFloat
363363

364-
for hasNext, err := iterator.HasNext(ctx); hasNext && err == nil; {
364+
for {
365+
hasNext, err := iterator.HasNext(ctx)
366+
if !hasNext || err != nil {
367+
break
368+
}
369+
365370
val, _, err := iterator.Next(ctx)
366371

367372
if err != nil {
@@ -429,17 +434,22 @@ func ToInt(ctx context.Context, input Value) (Int, error) {
429434

430435
res := ZeroInt
431436

432-
for hasNext, err := iterator.HasNext(ctx); hasNext && err == nil; {
437+
for {
438+
hasNext, err := iterator.HasNext(ctx)
439+
if !hasNext || err != nil {
440+
break
441+
}
442+
433443
item, _, err := iterator.Next(ctx)
434444

435445
if err != nil {
436-
return ZeroInt, err
446+
continue
437447
}
438448

439449
i, err := ToInt(ctx, item)
440450

441451
if err != nil {
442-
return ZeroInt, err
452+
continue
443453
}
444454

445455
res += i

pkg/runtime/object_iter.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ func (iter *ObjectIterator) HasNext(_ context.Context) (bool, error) {
2828
}
2929

3030
func (iter *ObjectIterator) Next(_ context.Context) (Value, Value, error) {
31-
iter.pos++
31+
if iter.pos >= len(iter.keys) {
32+
return None, None, Error(ErrInvalidOperation, "no more elements")
33+
}
3234

33-
value := iter.data[iter.keys[iter.pos-1]]
34-
key := String(iter.keys[iter.pos-1])
35+
key := iter.keys[iter.pos]
36+
value := iter.data[key]
37+
iter.pos++
3538

36-
return value, key, nil
39+
return value, String(key), nil
3740
}

0 commit comments

Comments
 (0)