-
Notifications
You must be signed in to change notification settings - Fork 649
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
panic: runtime error: unsafe pointer conversion (Go 1.14) #187
Comments
Maybe this https://go-review.googlesource.com/c/net/+/203400/2/ipv4/control_bsd.go gives a hint. |
I made this unpleasant discovery while looking into this.
10/11 of these type conversions scream wrong to me, and I have little confidence that the 11th is far better. Quoting from unsafe.Pointer's docs:
The conversions to arrays of 0x7FFFFFF elements are clearly violating this rule, and the ones to Taking the address |
I've made some initial progress towards fixing this here: https://github.com/jrick/bbolt/tree/checkptr (compare) The approach I've taken is to only create slices of the necessary size, rather than subslicing arrays which are too large. I've also removed unaligned access even on arches where the hardware permits it. However, I've introduced a data consistency error that isn't caught by the tests on master:
Help is appreciated since this is an unfamiliar codebase for me. edit: fixed in 272f6cd. |
After looking into the checkptr code, re-reading https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices and experimenting myself, it is my understanding that this isn't true per se. Specifically, there is a valid pattern of converting between two slices involving these huge arrays, namely
The overall value of this expression, if considered as a single unit, does not produce any pointers that straddle more than one object (given the correct value for This pattern has in the past been preferred over constructing a
as both the construction of the header and the conversion to the slice type would have to occur as one. I can't really speak to any of the code flagged here, though; most of these slices look bizarre, as does the use of &p.ptr. |
Thanks for pointing that out; had not seen that before.
This would be invalid if it was a Go pointer converted to uintptr, since a garbage collection may occur between statements and the uintptr is not sufficient to keep the object alive. However it would not be invalid for any allocations with manual lifetime management (C malloc, or mmap pages as bbolt deals with). In any case, my patch used the pattern
instead of defining a reflect.SliceHeader variable in scope. This should have the same properties: treated as a single expression, the conversion occurs "at the same time". In any case, I tried writing some short programs doing the "max array length slice" pattern, and was not able to trip checkptr. The backing memory allocations were being created using C |
Now that go1.14 is released I switched the rclone CI over to using it, I'm now seeing these in the race enabled tests,
This is using Would it be possible to
Thank you :-) |
bbolt fails with "unsafe pointer conversion" under the go1.14 race detector. Disable race tests until etcd-io/bbolt#187 is fixed.
cc @jpbetz |
Have hit this when upgrading to 1.14 too! Would be awesome to get the fix merged |
So after updating the dependencies of our project after this issue got closed, with
I'm unsure if this is something entirely new, or was simply uncovered due to the recent fixes in this area. If it's unrelated, I'll open a distinct issue for it. Has anyone else run into similar issues? |
Never-mind, looks like we're running into this, which will be fixed in Go 1.14.2. |
Includes fixes for Go 1.14 See: etcd-io/bbolt#187
Signed-off-by: Gyuho Lee <[email protected]>
BBolt v1.3.4 can cause crashes on Go 1.14. etcd-io/bbolt#187
When use >= go1.14, the go will return the issue, like ``` checkptr: converted pointer straddles multiple allocations goroutine 27 [running]: runtime.throw(0xf8de9c, 0x3a) /usr/local/go/src/runtime/panic.go:1116 +0x72 fp=0xc0004afd80 sp=0xc0004afd50 pc=0x6ac9f2 runtime.checkptrAlignment(0xc0004afe78, 0xeabac0, 0x1) /usr/local/go/src/runtime/checkptr.go:20 +0xc9 fp=0xc0004afdb0 sp=0xc0004afd80 pc=0x67baa9 github.com/containerd/containerd/vendor/github.com/containerd/btrfs.SubvolCreate(0xc0001b2040, 0x31, 0x0, 0x0) /root/go/src/github.com/containerd/containerd/vendor/github.com/containerd/btrfs/btrfs.go:278 +0x185 fp=0xc0004b0ea8 sp=0xc0004afdb0 pc=0x899e45 github.com/containerd/containerd/snapshots/btrfs.(*snapshotter).makeSnapshot(0xc0005322d0, 0x1042c40, 0xc00018a360, 0x2, 0xf6e78e, 0x4, 0x0, 0x0, 0xc00053c040, 0x1, ...) /root/go/src/github.com/containerd/containerd/snapshots/btrfs/btrfs.go:216 +0x386 fp=0xc0004b13b0 sp=0xc0004b0ea8 pc=0xe2a646 github.com/containerd/containerd/snapshots/btrfs.(*snapshotter).Prepare(0xc0005322d0, 0x1042c40, 0xc000020180, 0xf6e78e, 0x4, 0x0, 0x0, 0xc00053c040, 0x1, 0x1, ...) /root/go/src/github.com/containerd/containerd/snapshots/btrfs/btrfs.go:186 +0xd0 fp=0xc0004b1468 sp=0xc0004b13b0 pc=0xe2a050 github.com/containerd/containerd/snapshots/testsuite.baseTestSnapshots(0x1042c40, 0xc000020180, 0x1047ec0, 0xc0005322d0, 0x6be694, 0xc0005443e9) /root/go/src/github.com/containerd/containerd/snapshots/testsuite/testsuite.go:563 +0x11a fp=0xc0004b15b8 sp=0xc0004b1468 pc=0xe1951a github.com/containerd/containerd/snapshots/testsuite.checkUpdate(0x1042c40, 0xc000020180, 0xc000083e00, 0x1047ec0, 0xc0005322d0, 0xc00052c300, 0x28) /root/go/src/github.com/containerd/containerd/snapshots/testsuite/testsuite.go:592 +0x125 fp=0xc0004b1c30 sp=0xc0004b15b8 pc=0xe1a065 github.com/containerd/containerd/snapshots/testsuite.makeTest.func1(0xc000083e00) /root/go/src/github.com/containerd/containerd/snapshots/testsuite/testsuite.go:117 +0x72e fp=0xc0004b1ed0 sp=0xc0004b1c30 pc=0xe244ee testing.tRunner(0xc000083e00, 0xc000149590) /usr/local/go/src/testing/testing.go:1123 +0x203 fp=0xc0004b1fd0 sp=0xc0004b1ed0 pc=0x819ba3 runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc0004b1fd8 sp=0xc0004b1fd0 pc=0x6e6401 created by testing.(*T).Run /usr/local/go/src/testing/testing.go:1168 +0x5bc ``` Should use (*[x]T)(ptr)[:n:m] to prevent the issue. Reference: etcd-io/bbolt#187 (comment) Signed-off-by: Wei Fu <[email protected]>
When use >= go1.14, the go will return the issue, like ``` checkptr: converted pointer straddles multiple allocations goroutine 27 [running]: runtime.throw(0xf8de9c, 0x3a) /usr/local/go/src/runtime/panic.go:1116 +0x72 fp=0xc0004afd80 sp=0xc0004afd50 pc=0x6ac9f2 runtime.checkptrAlignment(0xc0004afe78, 0xeabac0, 0x1) /usr/local/go/src/runtime/checkptr.go:20 +0xc9 fp=0xc0004afdb0 sp=0xc0004afd80 pc=0x67baa9 github.com/containerd/containerd/vendor/github.com/containerd/btrfs.SubvolCreate(0xc0001b2040, 0x31, 0x0, 0x0) /root/go/src/github.com/containerd/containerd/vendor/github.com/containerd/btrfs/btrfs.go:278 +0x185 fp=0xc0004b0ea8 sp=0xc0004afdb0 pc=0x899e45 github.com/containerd/containerd/snapshots/btrfs.(*snapshotter).makeSnapshot(0xc0005322d0, 0x1042c40, 0xc00018a360, 0x2, 0xf6e78e, 0x4, 0x0, 0x0, 0xc00053c040, 0x1, ...) /root/go/src/github.com/containerd/containerd/snapshots/btrfs/btrfs.go:216 +0x386 fp=0xc0004b13b0 sp=0xc0004b0ea8 pc=0xe2a646 github.com/containerd/containerd/snapshots/btrfs.(*snapshotter).Prepare(0xc0005322d0, 0x1042c40, 0xc000020180, 0xf6e78e, 0x4, 0x0, 0x0, 0xc00053c040, 0x1, 0x1, ...) /root/go/src/github.com/containerd/containerd/snapshots/btrfs/btrfs.go:186 +0xd0 fp=0xc0004b1468 sp=0xc0004b13b0 pc=0xe2a050 github.com/containerd/containerd/snapshots/testsuite.baseTestSnapshots(0x1042c40, 0xc000020180, 0x1047ec0, 0xc0005322d0, 0x6be694, 0xc0005443e9) /root/go/src/github.com/containerd/containerd/snapshots/testsuite/testsuite.go:563 +0x11a fp=0xc0004b15b8 sp=0xc0004b1468 pc=0xe1951a github.com/containerd/containerd/snapshots/testsuite.checkUpdate(0x1042c40, 0xc000020180, 0xc000083e00, 0x1047ec0, 0xc0005322d0, 0xc00052c300, 0x28) /root/go/src/github.com/containerd/containerd/snapshots/testsuite/testsuite.go:592 +0x125 fp=0xc0004b1c30 sp=0xc0004b15b8 pc=0xe1a065 github.com/containerd/containerd/snapshots/testsuite.makeTest.func1(0xc000083e00) /root/go/src/github.com/containerd/containerd/snapshots/testsuite/testsuite.go:117 +0x72e fp=0xc0004b1ed0 sp=0xc0004b1c30 pc=0xe244ee testing.tRunner(0xc000083e00, 0xc000149590) /usr/local/go/src/testing/testing.go:1123 +0x203 fp=0xc0004b1fd0 sp=0xc0004b1ed0 pc=0x819ba3 runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc0004b1fd8 sp=0xc0004b1fd0 pc=0x6e6401 created by testing.(*T).Run /usr/local/go/src/testing/testing.go:1168 +0x5bc ``` Should use (*[x]T)(ptr)[:n:m] to prevent the issue. Reference: etcd-io/bbolt#187 (comment) Signed-off-by: Wei Fu <[email protected]>
same issue
|
@forsaken628 use bbolt 1.3.5. |
condition issues in tests related to go1.14 pointer checks and mentioned on github etcd-io/bbolt#187
* control concurrent access to cached queries with mutex to avoid race conditions * use currently maintained and new version of boltdb to fix race condition issues in tests related to go1.14 pointer checks and mentioned on github etcd-io/bbolt#187 * * use race detector for golang unit tests * remove extra test run with GODEBUG=tls13=1 due to env variable was removed and unsupported since go1.14 https://go.dev/doc/go1.14
github.com/coreos/bbolt now redirects to https://github.com/etcd-io/bbolt, which documents that the code can be fetched via `go get go.etcd.io/bbolt/...`. This update fixes a race condition coming from this library that triggered `go test -race`. See also: etcd-io/bbolt#187
- retry_interceptor_test causes: clientv3/naming/grpc.go:25:2: module google.golang.org/grpc@latest found (v1.46.0), but does not contain package google.golang.org/grpc/naming etcd-io#12124 - old bolt db causes: fatal error: checkptr: converted pointer straddles multiple allocations etcd-io/bbolt#187
In Go 1.14 there is now checks of pointer conversions with the requirement that they should align to the "natural size".
It seems like they decided to make this enabled when
-race
is specified: golang/go#34964This leads to crashes like this:
The text was updated successfully, but these errors were encountered: