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

fix: prevent actions on closed C graphviz context #41

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

edamato
Copy link

@edamato edamato commented Apr 5, 2021

Calling any of the gvc Context dependent functions post gvc.Close() causes a go panic. When using a deferred Close() it's quite easy to trigger this without realising it.

This also seems to be very similar to the trace on: #20

The solution here is not very graceful, but the context seems to be a passthrough to the C objects so it didn't seem very easy to create a reliable way to query if the context was active or not.

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x2 addr=0x21baa83 pc=0x21baa83]

runtime stack:
runtime.throw(0x68b73f, 0x2a)
        /home/goprojects/go/src/runtime/panic.go:1116 +0x72 fp=0x7ffd0d88eac8 sp=0x7ffd0d88ea98 pc=0x44d1b2
runtime.sigpanic()
        /home/goprojects/go/src/runtime/signal_unix.go:726 +0x4ac fp=0x7ffd0d88eaf8 sp=0x7ffd0d88eac8 pc=0x46124c

goroutine 1 [syscall]:
runtime.cgocall(0x53b8d0, 0xc000153a98, 0x0)
        /home/goprojects/go/src/runtime/cgocall.go:133 +0x5b fp=0xc000153a68 sp=0xc000153a30 pc=0x41cf9b
github.com/goccy/go-graphviz/internal/ccall._Cfunc_gvLayout(0x21b6f70, 0x21b8810, 0x21d5de0, 0x0)
        _cgo_gotypes.go:2381 +0x4d fp=0xc000153a98 sp=0xc000153a68 pc=0x4d14ed
github.com/goccy/go-graphviz/internal/ccall.GvLayout.func1(0xc000b13678, 0xc0001300e0, 0x683ec2, 0x5, 0x53aef0)
        /home/goprojects/go/src/github.com/goccy/go-graphviz/internal/ccall/gvc.go:736 +0xe5 fp=0xc000153ae0 sp=0xc000153a98 pc=0x4d4985
github.com/goccy/go-graphviz/internal/ccall.GvLayout(0xc000b13678, 0xc0001300e0, 0x683ec2, 0x5, 0x21b6f70, 0xc000000000)
        /home/goprojects/go/src/github.com/goccy/go-graphviz/internal/ccall/gvc.go:736 +0x49 fp=0xc000153b18 sp=0xc000153ae0 pc=0x4d3ee9
github.com/goccy/go-graphviz/gvc.(*Context).Layout(...)
        /home/goprojects/go/src/github.com/goccy/go-graphviz/gvc/gvc.go:29
github.com/goccy/go-graphviz.(*Graphviz).RenderFilename(0xc000114150, 0xc0001300e8, 0x683c56, 0x3, 0x68ce05, 0x46, 0x0, 0x0)
        /home/goprojects/go/src/github.com/goccy/go-graphviz/graphviz.go:115 +0x74 fp=0xc000153b90 sp=0xc000153b18 pc=0x533194
github.com/goprojects/ggraph.(*Graph).RenderPNG(0xc000153e60, 0x68ce05, 0x46, 0x0, 0x0)
        /home/goprojects/go/src/github.com/goprojects/ggraph/ggraph.go:430 +0x1e5 fp=0xc000153c30 sp=0xc000153b90 pc=0x537b25
main.main()
        /home/goprojects/go/src/github.com/goprojects/go.toys/graph_exercises/main.go:130 +0xb0f fp=0xc000153f88 sp=0xc000153c30 pc=0x538f2f
runtime.main()
        /home/goprojects/go/src/runtime/proc.go:204 +0x209 fp=0xc000153fe0 sp=0xc000153f88 pc=0x44f9a9
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc000153fe8 sp=0xc000153fe0 pc=0x47e401

goroutine 2 [force gc (idle)]:
runtime.gopark(0x68d798, 0x80f590, 0x1411, 0x1)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc000032fb0 sp=0xc000032f90 pc=0x44fda5
runtime.goparkunlock(...)
        /home/goprojects/go/src/runtime/proc.go:312
runtime.forcegchelper()
        /home/goprojects/go/src/runtime/proc.go:255 +0xc5 fp=0xc000032fe0 sp=0xc000032fb0 pc=0x44fc45
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc000032fe8 sp=0xc000032fe0 pc=0x47e401
created by runtime.init.6
        /home/goprojects/go/src/runtime/proc.go:243 +0x35

goroutine 3 [GC sweep wait]:
runtime.gopark(0x68d798, 0x80f6a0, 0x140c, 0x1)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc0000337a8 sp=0xc000033788 pc=0x44fda5
runtime.goparkunlock(...)
        /home/goprojects/go/src/runtime/proc.go:312
runtime.bgsweep(0xc00001e1c0)
        /home/goprojects/go/src/runtime/mgcsweep.go:182 +0x13b fp=0xc0000337d8 sp=0xc0000337a8 pc=0x43c29b
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc0000337e0 sp=0xc0000337d8 pc=0x47e401
created by runtime.gcenable
        /home/goprojects/go/src/runtime/mgc.go:217 +0x5c

goroutine 4 [GC scavenge wait]:
runtime.gopark(0x68d798, 0x80f740, 0x140d, 0x1)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc000033f78 sp=0xc000033f58 pc=0x44fda5
runtime.goparkunlock(...)
        /home/goprojects/go/src/runtime/proc.go:312
runtime.bgscavenge(0xc00001e1c0)
        /home/goprojects/go/src/runtime/mgcscavenge.go:314 +0x29c fp=0xc000033fd8 sp=0xc000033f78 pc=0x43a3fc
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc000033fe0 sp=0xc000033fd8 pc=0x47e401
created by runtime.gcenable
        /home/goprojects/go/src/runtime/mgc.go:218 +0x7e

goroutine 18 [finalizer wait]:
runtime.gopark(0x68d798, 0x84a1a0, 0xffff1410, 0x1)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc000032758 sp=0xc000032738 pc=0x44fda5
runtime.goparkunlock(...)
        /home/goprojects/go/src/runtime/proc.go:312
runtime.runfinq()
        /home/goprojects/go/src/runtime/mfinal.go:175 +0xa9 fp=0xc0000327e0 sp=0xc000032758 pc=0x431189
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc0000327e8 sp=0xc0000327e0 pc=0x47e401
created by runtime.createfing
        /home/goprojects/go/src/runtime/mfinal.go:156 +0x65

goroutine 19 [GC worker (idle)]:
runtime.gopark(0x68d658, 0xc000550000, 0x1418, 0x0)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc00002e760 sp=0xc00002e740 pc=0x44fda5
runtime.gcBgMarkWorker(0xc000024000)
        /home/goprojects/go/src/runtime/mgc.go:1891 +0xff fp=0xc00002e7d8 sp=0xc00002e760 pc=0x434c5f
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc00002e7e0 sp=0xc00002e7d8 pc=0x47e401
created by runtime.gcBgMarkStartWorkers
        /home/goprojects/go/src/runtime/mgc.go:1839 +0x77

goroutine 34 [GC worker (idle)]:
runtime.gopark(0x68d658, 0xc000550010, 0x1418, 0x0)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc000558760 sp=0xc000558740 pc=0x44fda5
runtime.gcBgMarkWorker(0xc000026800)
        /home/goprojects/go/src/runtime/mgc.go:1891 +0xff fp=0xc0005587d8 sp=0xc000558760 pc=0x434c5f
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc0005587e0 sp=0xc0005587d8 pc=0x47e401
created by runtime.gcBgMarkStartWorkers
        /home/goprojects/go/src/runtime/mgc.go:1839 +0x77

goroutine 5 [GC worker (idle)]:
runtime.gopark(0x68d658, 0xc0000200a0, 0x1418, 0x0)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc000034760 sp=0xc000034740 pc=0x44fda5
runtime.gcBgMarkWorker(0xc000029000)
        /home/goprojects/go/src/runtime/mgc.go:1891 +0xff fp=0xc0000347d8 sp=0xc000034760 pc=0x434c5f
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc0000347e0 sp=0xc0000347d8 pc=0x47e401
created by runtime.gcBgMarkStartWorkers
        /home/goprojects/go/src/runtime/mgc.go:1839 +0x77

goroutine 35 [GC worker (idle)]:
runtime.gopark(0x68d658, 0xc000550020, 0x1418, 0x0)
        /home/goprojects/go/src/runtime/proc.go:306 +0xe5 fp=0xc000558f60 sp=0xc000558f40 pc=0x44fda5
runtime.gcBgMarkWorker(0xc00002b800)
        /home/goprojects/go/src/runtime/mgc.go:1891 +0xff fp=0xc000558fd8 sp=0xc000558f60 pc=0x434c5f
runtime.goexit()
        /home/goprojects/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc000558fe0 sp=0xc000558fd8 pc=0x47e401
created by runtime.gcBgMarkStartWorkers
        /home/goprojects/go/src/runtime/mgc.go:1839 +0x77

Process finished with exit code 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant