Skip to content

Commit 39ff14e

Browse files
authored
Fix dict array dict (#5801)
* Fix dict array dict I can get cnquery to panic with the following: ``` go run ./apps/cnspec/ run local -c " lsblkDevice = parse.json(content: command('lsblk -a --json -s overlay').stdout).params lsblkDevice['blockdevices'][0]['children'][0]['type'] == 'crypt' || lsblkDevice['blockdevices'][0]['type'] == 'crypt' " ``` ``` panic: runtime error: index out of range [0] with length 0 goroutine 93 [running]: go.mondoo.com/cnquery/v11/llx.dictGetIndexV2(0x32c9590?, 0xc001b86180, 0x2cd4c13?, 0x2?) /home/jaym/workspace/mondoo/cnquery/llx/builtin_map.go:371 +0x64b go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runBoundFunction(0xc0004a9f10, 0xc001b86180, 0xc00181c280, 0x100000007) /home/jaym/workspace/mondoo/cnquery/llx/builtin.go:905 +0x16e go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runFunction(0xc0004a9f10, 0xc00181c280, 0x100000007) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:816 +0x173 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runChunk(0xc0004a9f10, 0xc0017d9058?, 0x100000007) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:833 +0x225 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runRef(0xc001a84b60?, 0x0?) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:858 +0xd9 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runChain(0xc0004a9f10, 0x40cae6?) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:890 +0x94 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).triggerChain(0xc0004a9f10, 0x100000004, 0xc001b860f0) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:962 +0x32e go.mondoo.com/cnquery/v11/llx.runResourceFunction.func1({0x2886360, 0xc001b86060}, {0x0, 0x0}) /home/jaym/workspace/mondoo/cnquery/llx/builtin.go:852 +0x209 go.mondoo.com/cnquery/v11/providers.(*Runtime).WatchAndUpdate(0xc000679780, {0x3269188, 0xc001908440}, {0xc0011bfd00, 0x6}, {0xc0012cc100, 0x31}, 0xc001902ea0) /home/jaym/workspace/mondoo/cnquery/providers/runtime.go:385 +0xe2 go.mondoo.com/cnquery/v11/llx.runResourceFunction(0xc0004a9f10, 0xc001902e40?, 0xc00181c0f0, 0x100000004) /home/jaym/workspace/mondoo/cnquery/llx/builtin.go:833 +0x2d7 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runBoundFunction(0xc0004a9f10, 0xc001902e40, 0xc00181c0f0, 0x100000004) /home/jaym/workspace/mondoo/cnquery/llx/builtin.go:899 +0x38a go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runFunction(0xc0004a9f10, 0xc00181c0f0, 0x100000004) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:816 +0x173 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runChunk(0xc0004a9f10, 0xc0017d9528?, 0x100000004) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:833 +0x225 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runRef(0xc001a84b60?, 0xc00056f6e0?) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:858 +0xd9 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runChain(0xc0004a9f10, 0x40cae6?) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:890 +0x94 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).triggerChain(0xc0004a9f10, 0x100000002, 0xc00056f710) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:962 +0x32e go.mondoo.com/cnquery/v11/llx.runResourceFunction.func1({0x26848e0, 0xc00178e570}, {0x0, 0x0}) /home/jaym/workspace/mondoo/cnquery/llx/builtin.go:852 +0x209 go.mondoo.com/cnquery/v11/providers.(*Runtime).WatchAndUpdate(0xc000679780, {0x3269188, 0xc000ac39e0}, {0xc0011bfcf8, 0x6}, {0xc0011c9f00, 0x31}, 0xc00182c3c0) /home/jaym/workspace/mondoo/cnquery/providers/runtime.go:385 +0xe2 go.mondoo.com/cnquery/v11/llx.runResourceFunction(0xc0004a9f10, 0xc00182c360?, 0xc000b0fef0, 0x100000002) /home/jaym/workspace/mondoo/cnquery/llx/builtin.go:833 +0x2d7 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runBoundFunction(0xc0004a9f10, 0xc00182c360, 0xc000b0fef0, 0x100000002) /home/jaym/workspace/mondoo/cnquery/llx/builtin.go:899 +0x38a go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runFunction(0xc0004a9f10, 0xc000b0fef0, 0x100000002) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:816 +0x173 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runChunk(0xc0004a9f10, 0xc00182b9f8?, 0x100000002) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:833 +0x225 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runRef(0xc001a84b60?, 0xc0000e7a70?) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:858 +0xd9 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).runChain(0xc0004a9f10, 0x2cdb239?) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:890 +0x94 go.mondoo.com/cnquery/v11/llx.(*blockExecutor).run(0xc0004a9f10) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:358 +0x317 go.mondoo.com/cnquery/v11/llx.(*MQLExecutorV2).Run(0xc000d0f140?) /home/jaym/workspace/mondoo/cnquery/llx/llx.go:288 +0x53 go.mondoo.com/cnquery/v11/mql/internal.(*executionManager).executeCodeBundle(0xc000d0f440, 0xc0011e0be0, 0xc001a81c20, {0x0, 0x0}) /home/jaym/workspace/mondoo/cnquery/mql/internal/execution_manager.go:170 +0x5b9 go.mondoo.com/cnquery/v11/mql/internal.(*executionManager).Start.func1() /home/jaym/workspace/mondoo/cnquery/mql/internal/execution_manager.go:88 +0x1cb created by go.mondoo.com/cnquery/v11/mql/internal.(*executionManager).Start in goroutine 1 /home/jaym/workspace/mondoo/cnquery/mql/internal/execution_manager.go:57 +0x65 ``` I've made the index lookup behave like a regular typed array * add test
1 parent 981ea77 commit 39ff14e

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

llx/builtin_map.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,17 @@ func dictGetIndexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (
364364
if t != types.Int {
365365
return nil, 0, errors.New("Called [] with wrong type " + t.Label())
366366
}
367-
// ^^ TODO
368367

369368
key := int(bytes2int(args[0].Value))
369+
if key < 0 {
370+
if -key > len(x) {
371+
return nil, 0, errors.New("array index out of bound (trying to access element " + strconv.Itoa(key) + ", max: " + strconv.Itoa(len(x)-1) + ")")
372+
}
373+
key = len(x) + key
374+
}
375+
if key >= len(x) {
376+
return nil, 0, errors.New("array index out of bound (trying to access element " + strconv.Itoa(key) + ", max: " + strconv.Itoa(len(x)-1) + ")")
377+
}
370378
return &RawData{
371379
Value: x[key],
372380
Type: bind.Type,

mql/mql_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,40 @@ func TestCustomData(t *testing.T) {
102102
assert.Equal(t, map[string]interface{}{"a": "valuea", "b": "valueb"}, value.Value)
103103
}
104104

105+
func TestJsonArrayBounds(t *testing.T) {
106+
t.Run("out of bounds", func(t *testing.T) {
107+
query := `x = parse.json(content: '{"arr": []}').params
108+
x['arr'][0]`
109+
value, err := mql.Exec(query, runtime(), features, nil)
110+
require.NoError(t, err)
111+
require.Contains(t, value.Error.Error(), "array index out of bound")
112+
})
113+
114+
t.Run("positive index", func(t *testing.T) {
115+
query := `x = parse.json(content: '{"arr": [1, 2, 3]}').params
116+
x['arr'][1]`
117+
value, err := mql.Exec(query, runtime(), features, nil)
118+
require.NoError(t, err)
119+
require.Equal(t, float64(2), value.Value)
120+
})
121+
122+
t.Run("negative index", func(t *testing.T) {
123+
query := `x = parse.json(content: '{"arr": [1, 2, 3]}').params
124+
x['arr'][-1]`
125+
value, err := mql.Exec(query, runtime(), features, nil)
126+
require.NoError(t, err)
127+
require.Equal(t, float64(3), value.Value)
128+
})
129+
130+
t.Run("negative index out of bounds", func(t *testing.T) {
131+
query := `x = parse.json(content: '{"arr": [1, 2, 3]}').params
132+
x['arr'][-4]`
133+
value, err := mql.Exec(query, runtime(), features, nil)
134+
require.NoError(t, err)
135+
require.Contains(t, value.Error.Error(), "array index out of bound")
136+
})
137+
}
138+
105139
func TestMqlProps(t *testing.T) {
106140
query := "props.a + props.b"
107141
props := map[string]*llx.Primitive{

0 commit comments

Comments
 (0)