From: Ian Lance Taylor Date: Wed, 11 Apr 2018 21:16:52 +0000 (-0700) Subject: cmd/internal/obj/arm64: don't crash on trailing NOP X-Git-Tag: go1.11beta1~866 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=95b4498ac0c70a2c3c2a0c60d66aa74b10bca76d;p=gostls13.git cmd/internal/obj/arm64: don't crash on trailing NOP Fixes #20348 Change-Id: I831aeeee8e20d55b3e47dea67786e883b213cd58 Reviewed-on: https://go-review.googlesource.com/106457 Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick Reviewed-by: Aram Hăvărneanu TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/internal/obj/arm64/asm_test.go b/src/cmd/internal/obj/arm64/asm_test.go index 3e0c9c13a6..68f5b0b346 100644 --- a/src/cmd/internal/obj/arm64/asm_test.go +++ b/src/cmd/internal/obj/arm64/asm_test.go @@ -61,3 +61,21 @@ func gen(buf *bytes.Buffer) { fmt.Fprintln(buf, "label:") fmt.Fprintln(buf, "RET") } + +// Issue 20348. +func TestNoRet(t *testing.T) { + dir, err := ioutil.TempDir("", "testnoret") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + tmpfile := filepath.Join(dir, "x.s") + if err := ioutil.WriteFile(tmpfile, []byte("TEXT ·stub(SB),$0-0\nNOP\n"), 0644); err != nil { + t.Fatal(err) + } + cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", filepath.Join(dir, "x.o"), tmpfile) + cmd.Env = []string{"GOARCH=arm64", "GOOS=linux"} + if out, err := cmd.CombinedOutput(); err != nil { + t.Errorf("%v\n%s", err, out) + } +} diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index 1bd4a5d7b1..9c3d22050e 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -476,9 +476,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { break case obj.ANOP: - q1 = p.Link - q.Link = q1 /* q is non-nop */ - q1.Mark |= p.Mark + if p.Link != nil { + q1 = p.Link + q.Link = q1 /* q is non-nop */ + q1.Mark |= p.Mark + } continue case ABL,