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

debug/buildinfo: timeout in Read #54968

Open
catenacyber opened this issue Sep 9, 2022 · 4 comments · May be fixed by #54971
Open

debug/buildinfo: timeout in Read #54968

catenacyber opened this issue Sep 9, 2022 · 4 comments · May be fixed by #54971
Labels
NeedsFix The path to resolution is known, but the work has not been done.
Milestone

Comments

@catenacyber
Copy link
Contributor

catenacyber commented Sep 9, 2022

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

$ go version
go version go1.17.6 darwin/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
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/catena/Library/Caches/go-build"
GOENV="/Users/catena/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/catena/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/catena/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.17.6"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/catena/go/src/github.com/catenacyber/go/src/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/pp/dc1dtf9x2js3v0jx_m010nqr0000gn/T/go-build4237848497=/tmp/go-build -gno-record-gcc-switches -fno-common"
GOROOT/bin/go version: go version go1.17.6 darwin/amd64
GOROOT/bin/go tool compile -V: compile version go1.17.6
uname -v: Darwin Kernel Version 21.3.0: Wed Jan  5 21:37:58 PST 2022; root:xnu-8019.80.24~20/RELEASE_X86_64
ProductName:	macOS
ProductVersion:	12.2.1
BuildVersion:	21D62
lldb --version: lldb-1316.0.9.41
Apple Swift version 5.6 (swiftlang-5.6.0.323.62 clang-1316.0.20.8)
gdb --version: GNU gdb (GDB) 9.1

What did you do?

Run https://go.dev/play/p/IZmSLdUzIaS?v=gotip

What did you expect to see?

The program finishing and printing Hello

What did you see instead?

timeout running program

Program exited.

Found by https://github.com/catenacyber/ngolo-fuzzing on oss-fuzz
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=51153

@gopherbot
Copy link

gopherbot commented Sep 9, 2022

Change https://go.dev/cl/429815 mentions this issue: debug/buildinfo: correct a typo in calculating next align index

@mknyszek mknyszek added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Sep 9, 2022
@mknyszek mknyszek added this to the Backlog milestone Sep 9, 2022
@mknyszek
Copy link
Contributor

mknyszek commented Sep 9, 2022

CC @golang/compiler

@ZekeLu
Copy link
Contributor

ZekeLu commented Sep 10, 2022

it timeout on the playground because the for loop below never exits.

The value of i on line 159 is 1, and the result of i+buildInfoAlign-1)&^buildInfoAlign on line 167 is 0. So on line 167 the data slice is not changed. Then it enters the next loop with the same data slice. So the loop never exits.

The purpose of line 167 is data = data[n:] where n is the smallest number that fulfills n >= i && n % buildInfoAlign == 0 (namely, n should be 16, 32, 48, ...).

It's obviously there is a typo. The expression should be: data = data[(i+buildInfoAlign-1)&^(buildInfoAlign-1):]

const (
buildInfoAlign = 16
buildInfoSize = 32
)
for {
i := bytes.Index(data, buildInfoMagic)
if i < 0 || len(data)-i < buildInfoSize {
return "", "", errNotGoExe
}
if i%buildInfoAlign == 0 && len(data)-i >= buildInfoSize {
data = data[i:]
break
}
data = data[(i+buildInfoAlign-1)&^buildInfoAlign:]
}


Here are other places that use the same pattern:

go/src/cmd/cgo/gcc.go

Lines 2995 to 2996 in 54182ff

// Round off up to talign, assumed to be a power of 2.
off = (off + talign - 1) &^ (talign - 1)

// round to a multiple of r, r is a power of 2
func round(o int64, r int64) int64 {
return (o + r - 1) &^ (r - 1)
}

go/src/runtime/stubs.go

Lines 411 to 414 in 54182ff

// alignUp rounds n up to a multiple of a. a must be a power of 2.
func alignUp(n, a uintptr) uintptr {
return (n + a - 1) &^ (a - 1)
}

alignedOff := (off + align - 1) &^ (align - 1)

@mdempsky
Copy link
Member

mdempsky commented Sep 10, 2022

Thanks @ZekeLu for the detailed assessment.

I agree that it appears to be a typo and the correct statement is data = data[(i+buildInfoAlign-1)&^(buildInfoAlign-1):].

@mdempsky mdempsky added NeedsFix The path to resolution is known, but the work has not been done. and removed NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. labels Sep 10, 2022
@mdempsky mdempsky modified the milestones: Backlog, Go1.20 Sep 10, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NeedsFix The path to resolution is known, but the work has not been done.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants