Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

corrupt object panic during partial evaluation when ref used as object key #1177

Closed
tsandall opened this issue Jan 20, 2019 · 0 comments · Fixed by #1519
Closed

corrupt object panic during partial evaluation when ref used as object key #1177

tsandall opened this issue Jan 20, 2019 · 0 comments · Fixed by #1519
Assignees

Comments

@tsandall
Copy link
Member

tsandall commented Jan 20, 2019

Encountered this on v0.10.2. I think this might be related to #1125.

$ ./opa_linux_amd64 eval -p -f pretty '{input.x: 1}' 
panic: corrupt object

goroutine 1 [running]:
github.com/open-policy-agent/opa/ast.(*object).Iter(0xc42025cf00, 0xc42029e288, 0x20, 0xd83a40)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/term.go:1563 +0xef
github.com/open-policy-agent/opa/ast.(*object).Foreach(0xc42025cf00, 0xc42025ee80)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/term.go:1586 +0x4b
github.com/open-policy-agent/opa/ast.WalkBeforeAndAfter(0xeb6da0, 0xc420249b90, 0xe082c0, 0xc42025cf00)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:104 +0x898
github.com/open-policy-agent/opa/ast.Walk(0xead280, 0xc4201d6550, 0xe082c0, 0xc42025cf00)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:30 +0x7a
github.com/open-policy-agent/opa/ast.WalkBeforeAndAfter(0xeb6da0, 0xc420249b80, 0xde25e0, 0xc42025ec80)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:98 +0xe57
github.com/open-policy-agent/opa/ast.Walk(0xead280, 0xc4201d6550, 0xde25e0, 0xc42025ec80)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:30 +0x7a
github.com/open-policy-agent/opa/ast.WalkBeforeAndAfter(0xeb6da0, 0xc420249b10, 0xe08e20, 0xc42020cff0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:86 +0x9e4
github.com/open-policy-agent/opa/ast.Walk(0xead280, 0xc4201d6550, 0xe08e20, 0xc42020cff0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:30 +0x7a
github.com/open-policy-agent/opa/ast.WalkBeforeAndAfter(0xeb6da0, 0xc420249b00, 0xde35a0, 0xc42025ee60)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:76 +0xb7d
github.com/open-policy-agent/opa/ast.Walk(0xead280, 0xc4201d6550, 0xde35a0, 0xc42025ee60)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:30 +0x7a
github.com/open-policy-agent/opa/ast.WalkRefs(0xde35a0, 0xc42025ee60, 0xc42025cf30)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/ast/visit.go:167 +0xa2
github.com/open-policy-agent/opa/topdown/copypropagation.(*binding).containedIn(0xc42025ebc0, 0xc4201d6540, 0x1, 0x1, 0x0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/copypropagation/copypropagation.go:283 +0x27b
github.com/open-policy-agent/opa/topdown/copypropagation.(*CopyPropagator).Apply(0xc42025cc30, 0xc420249690, 0x2, 0x2, 0xc4201d6540, 0x1, 0x1)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/copypropagation/copypropagation.go:140 +0xb99
github.com/open-policy-agent/opa/topdown.(*Query).PartialRun.func2(0xc420255e60, 0xeb6d20, 0xc42025e540)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/query.go:197 +0x3ef
github.com/open-policy-agent/opa/topdown.(*eval).Run.func1(0xc420255e60, 0xad5d00, 0x0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:59 +0x84
github.com/open-policy-agent/opa/topdown.(*eval).evalExpr(0xc420255e60, 0xc420249510, 0x13f4840, 0x1)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:170 +0x1b8
github.com/open-policy-agent/opa/topdown.(*eval).next(0xc420255e60, 0xc420249510, 0xc42025e400, 0x0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:86 +0x39
github.com/open-policy-agent/opa/topdown.(*eval).evalStep.func3(0xc42025e180, 0xc42025e4a0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:226 +0x26d
github.com/open-policy-agent/opa/topdown.(*eval).biunifyValues(0xc420255e60, 0xc420235b20, 0xc42025e4a0, 0xc42025e180, 0xc42025e180, 0xc42025ccf0, 0xc42025a401, 0xc4202495f0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:676 +0x468
github.com/open-policy-agent/opa/topdown.(*eval).biunify(0xc420255e60, 0xc420235b20, 0xc42025e4a0, 0xc42025e180, 0xc42025e180, 0xc42025ccf0, 0xd1fe01, 0xc42025ccf0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:569 +0x219
github.com/open-policy-agent/opa/topdown.(*eval).unify(0xc420255e60, 0xc420235b20, 0xc42025e4a0, 0xc42025ccf0, 0x2, 0xc42025a430)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:530 +0x57
github.com/open-policy-agent/opa/topdown.(*eval).evalStep(0xc420255e60, 0xc420249510, 0xc42020ca50, 0xc4201d6490)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:218 +0x2bd
github.com/open-policy-agent/opa/topdown.(*eval).evalExpr(0xc420255e60, 0xc420249510, 0x731aa0, 0xc400000008)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:185 +0x18c
github.com/open-policy-agent/opa/topdown.(*eval).next(0xc420255e60, 0xc420249510, 0xe2e70c, 0x4)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:86 +0x39
github.com/open-policy-agent/opa/topdown.(*eval).evalStep.func1(0xc420255e60, 0xeb58a0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:204 +0x4c
github.com/open-policy-agent/opa/topdown.(*eval).saveUnify(0xc420255e60, 0xc420235ee0, 0xc420235ac0, 0xc42025e180, 0xc42025e180, 0xc42025cc60, 0x0, 0x0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:916 +0x3b9
github.com/open-policy-agent/opa/topdown.(*eval).biunifyValues(0xc420255e60, 0xc420235ee0, 0xc420235ac0, 0xc42025e180, 0xc42025e180, 0xc42025cc60, 0xc42029f280, 0xa66152)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:648 +0x17f
github.com/open-policy-agent/opa/topdown.(*eval).biunify(0xc420255e60, 0xc420235ee0, 0xc420235ac0, 0xc42025e180, 0xc42025e180, 0xc42025cc60, 0x1, 0xc42025cc60)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:538 +0x11f
github.com/open-policy-agent/opa/topdown.(*eval).unify(0xc420255e60, 0xc420235ee0, 0xc420235ac0, 0xc42025cc60, 0xc42029f430, 0xab8413)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:530 +0x57
github.com/open-policy-agent/opa/topdown.(*eval).evalStep(0xc420255e60, 0xc420249510, 0xc42020caa0, 0xc42025e340)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:202 +0x402
github.com/open-policy-agent/opa/topdown.(*eval).evalExpr(0xc420255e60, 0xc420249510, 0x1, 0xc420249510)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:185 +0x18c
github.com/open-policy-agent/opa/topdown.(*eval).eval(0xc420255e60, 0xc420249510, 0xc42025e360, 0xc42025e360)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:157 +0x35
github.com/open-policy-agent/opa/topdown.(*eval).Run(0xc420255e60, 0xc42025e340, 0xc420249380, 0xc42025e2a0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/eval.go:57 +0xac
github.com/open-policy-agent/opa/topdown.(*Query).PartialRun(0xc420257040, 0xeb76a0, 0xc420026050, 0xc420026050, 0xc4202a0000, 0xc42025e120, 0x0, 0x0, 0x0, 0x0, ...)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/topdown/query.go:172 +0x888
github.com/open-policy-agent/opa/rego.(*Rego).partial(0xc420088300, 0xeb76a0, 0xc420026050, 0xc420233bf0, 0x2, 0x2, 0xead520, 0xc420244180, 0xe3184c, 0x7, ...)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/rego/rego.go:837 +0x667
github.com/open-policy-agent/opa/rego.(*Rego).Partial(0xc420088300, 0xeb76a0, 0xc420026050, 0x0, 0x0, 0x0)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/rego/rego.go:499 +0x1af
github.com/open-policy-agent/opa/cmd.eval(0xc4201f2440, 0x1, 0x4, 0x1, 0xc4201ea100, 0x1, 0x1, 0x0, 0x0, 0x0, ...)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/cmd/eval.go:278 +0x309
github.com/open-policy-agent/opa/cmd.init.3.func2(0xc4201f6280, 0xc4201f2440, 0x1, 0x4)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/cmd/eval.go:157 +0xab
github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra.(*Command).execute(0xc4201f6280, 0xc4201f2400, 0x4, 0x4, 0xc4201f6280, 0xc4201f2400)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra/command.go:766 +0x2c1
github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0x13e74e0, 0xc420071f68, 0xc944a3, 0xc420071f78)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra/command.go:852 +0x30a
github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra.(*Command).Execute(0x13e74e0, 0x2, 0xc4201e6120)
	/home/travis/gopath/src/github.com/open-policy-agent/opa/vendor/github.com/spf13/cobra/command.go:800 +0x2b
main.main()
	/home/travis/gopath/src/github.com/open-policy-agent/opa/main.go:12 +0x2d
@tsandall tsandall added the bug label Jan 20, 2019
@tsandall tsandall self-assigned this Apr 12, 2019
tsandall added a commit to tsandall/opa that referenced this issue Jun 24, 2019
Mutating term values used as object keys (or set elements) is not safe
because the underlying hashtables get corrupted. This a known issue
that was previously fixed in the compiler (open-policy-agent#1125). The simplest
solution in this case is to use the ast.Transform helper instead of
ast.Walk so that a copy of object and set terms is made.

Fixes open-policy-agent#1177

Signed-off-by: Torin Sandall <torinsandall@gmail.com>
tsandall added a commit that referenced this issue Jun 26, 2019
Mutating term values used as object keys (or set elements) is not safe
because the underlying hashtables get corrupted. This a known issue
that was previously fixed in the compiler (#1125). The simplest
solution in this case is to use the ast.Transform helper instead of
ast.Walk so that a copy of object and set terms is made.

Fixes #1177

Signed-off-by: Torin Sandall <torinsandall@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Archived in project
Development

Successfully merging a pull request may close this issue.

1 participant