From: Russ Cox Date: Thu, 18 Sep 2014 23:40:06 +0000 (-0400) Subject: syscall: fix infinite recursion in itoa X-Git-Tag: go1.4beta1~357 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ab76638cdc1705ec4f22cb6f757c1b542b388692;p=gostls13.git syscall: fix infinite recursion in itoa Fixes #8332. LGTM=dvyukov R=golang-codereviews, dvyukov CC=golang-codereviews https://golang.org/cl/138650044 --- diff --git a/src/syscall/export_test.go b/src/syscall/export_test.go new file mode 100644 index 0000000000..c9774622c8 --- /dev/null +++ b/src/syscall/export_test.go @@ -0,0 +1,7 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syscall + +var Itoa = itoa diff --git a/src/syscall/str.go b/src/syscall/str.go index 0fce842e8c..2ddf04b227 100644 --- a/src/syscall/str.go +++ b/src/syscall/str.go @@ -6,8 +6,12 @@ package syscall func itoa(val int) string { // do it here rather than with fmt to avoid dependency if val < 0 { - return "-" + itoa(-val) + return "-" + uitoa(uint(-val)) } + return uitoa(uint(val)) +} + +func uitoa(val uint) string { var buf [32]byte // big enough for int64 i := len(buf) - 1 for val >= 10 { diff --git a/src/syscall/syscall_test.go b/src/syscall/syscall_test.go index 2a39b54f1b..846c4873d2 100644 --- a/src/syscall/syscall_test.go +++ b/src/syscall/syscall_test.go @@ -5,6 +5,7 @@ package syscall_test import ( + "fmt" "syscall" "testing" ) @@ -28,3 +29,19 @@ func TestEnv(t *testing.T) { // make sure TESTENV gets set to "", not deleted testSetGetenv(t, "TESTENV", "") } + +func TestItoa(t *testing.T) { + // Make most negative integer: 0x8000... + i := 1 + for i<<1 != 0 { + i <<= 1 + } + if i >= 0 { + t.Fatal("bad math") + } + s := syscall.Itoa(i) + f := fmt.Sprint(i) + if s != f { + t.Fatalf("itoa(%d) = %s, want %s", i, s, f) + } +}