open-policy-agent / opa

Open Policy Agent (OPA) is an open source, general-purpose policy engine.
https://www.openpolicyagent.org
Apache License 2.0
9.55k stars 1.32k forks source link

Panic when evaluating function with dynamically-computed path #576

Closed tim-styra closed 4 years ago

tim-styra commented 6 years ago

Ran into a panic when evaluating a function whose path was computed dynamically.

Here's a version that does not exhibit the bug. It walks to the function baz from the root data.foo.

> package foo.bar
> baz(x) = x { true }
> package abc
> data.foo["bar"]["baz"](1) = x
+---+
| x |
+---+
| 1 |
+---+
> 

Here's a version that causes the panic. The difference is that we have an intermediate variable root that holds data.foo. It walks to the function baz from the variable root.

> package foo.bar
> baz(x) = x { true }
> package abc
> root = data.foo
> root["bar"]["baz"](1) = x
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x1401297]

goroutine 1 [running]:
github.com/open-policy-agent/opa/topdown.evalFunc.eval(0xc4202b71e0, 0xc4202bec60, 0x5, 0x6, 0xc4202c0688, 0x2, 0x2, 0xc4202cbef0, 0x100e9e2, 0xc4202cbef0)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/topdown/eval.go:785 +0x87
github.com/open-policy-agent/opa/topdown.(*eval).evalCall(0xc4202b71e0, 0x0, 0xc4202c0880, 0xc4202c0688, 0x2, 0x2, 0xc4202cbef0, 0xc4201750c8, 0x100e9e2)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/topdown/eval.go:289 +0x596
github.com/open-policy-agent/opa/topdown.(*eval).evalStep(0xc4202b71e0, 0x0, 0xc4202ccb20, 0xc420175138, 0x195a000)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/topdown/eval.go:193 +0x8e8
github.com/open-policy-agent/opa/topdown.(*eval).evalExpr(0xc4202b71e0, 0x0, 0xc4202ccb20, 0x1586501, 0xc4202ccb20)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/topdown/eval.go:155 +0x1db
github.com/open-policy-agent/opa/topdown.(*eval).eval(0xc4202b71e0, 0xc4202ccb20, 0xc4202cf100, 0xc4202cf100)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/topdown/eval.go:127 +0x3e
github.com/open-policy-agent/opa/topdown.(*eval).Run(0xc4202b71e0, 0xc4202ccb10, 0xc4201755a8, 0x15c7e92)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/topdown/eval.go:45 +0xb3
github.com/open-policy-agent/opa/topdown.(*Query).Iter(0xc4201755a8, 0x1827060, 0xc420010b70, 0xc4202cf0a0, 0x0, 0x0)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/topdown/query.go:197 +0x3e4
github.com/open-policy-agent/opa/repl.(*REPL).evalBody(0xc42017ac00, 0x1827060, 0xc420010b70, 0xc420289680, 0x0, 0x0, 0xc42000cf40, 0x1, 0x1, 0x1, ...)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/repl/repl.go:832 +0x4d0
github.com/open-policy-agent/opa/repl.(*REPL).evalStatement(0xc42017ac00, 0x1827060, 0xc420010b70, 0x15865a0, 0xc42028e060, 0x1, 0x1)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/repl/repl.go:727 +0x390
github.com/open-policy-agent/opa/repl.(*REPL).evalBufferOne(0xc42017ac00, 0x1827060, 0xc420010b70, 0x0, 0x1)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/repl/repl.go:618 +0x2ca
github.com/open-policy-agent/opa/repl.(*REPL).OneShot(0xc42017ac00, 0x1827060, 0xc420010b70, 0xc4201ad0c0, 0x19, 0x0, 0x0)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/repl/repl.go:270 +0x460
github.com/open-policy-agent/opa/repl.(*REPL).Loop(0xc42017ac00, 0x1827060, 0xc420010b70)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/repl/repl.go:177 +0x2c1
github.com/open-policy-agent/opa/runtime.(*Runtime).StartREPL(0xc4200b2960, 0x1827060, 0xc420010b70)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/runtime/runtime.go:210 +0x10d
github.com/open-policy-agent/opa/cmd.init.3.func1(0xc42000f200, 0x18874a8, 0x0, 0x0)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/cmd/run.go:134 +0x587
github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra.(*Command).execute(0xc42000f200, 0x18874a8, 0x0, 0x0, 0xc42000f200, 0x18874a8)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra/command.go:750 +0x2b9
github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0x1864200, 0xc42013df30, 0x1, 0x0)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra/command.go:831 +0x349
github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra.(*Command).Execute(0x1864200, 0x0, 0x0)
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra/command.go:784 +0x2b
main.main()
    /Users/tim/gocode/src/github.com/open-policy-agent/opa/main.go:12 +0x31
tsandall commented 4 years ago

This was fixed between v0.6.0 and v0.7.0.