Skip to content

runtime: msanread segfaults when called without a g #18707

@bcmills

Description

@bcmills

When building with -buildmode=c-shared, runtime.rt_sigaction ends up calling msanread on its arguments during libpreinit (before the runtime has set up a g).

Unfortunately, msanread assumes that it is always called with a valid g, leading to a segfault.

src/msanshared/msanshared.go:

package main

import "C"

func main() {}

src/msanshared/main.c:

int main() {
  return 0;
}
$ go version
go version devel +c1730ae424 Wed Jan 18 15:40:33 2017 +0000 linux/amd64
$ go env CC
clang-3.8
$ go env GOGCCFLAGS
-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build181672777=/tmp/go-build -gno-record-gcc-switches
$ go build -msan -buildmode=c-shared -o libmsanshared.so src/msanshared/msanshared.go
$ $(go env CC) $(go env GOGCCFLAGS) -fsanitize=memory -o msanshared src/msanshared/main.c libmsanshared.so
$ LD_LIBRARY_PATH=. ./msanshared
Segmentation fault (core dumped)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions