From 082a6a3a8b1835efccee8ec44ce37678b0ecb33e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 13 May 2015 12:54:11 -0700 Subject: [PATCH] unix: fix infinite recursion in itoa Bring in http://golang.org/cl/138650044 from syscall package. Change-Id: I554b0b31b981c682b6826644564971321a55c9e4 Reviewed-on: https://go-review.googlesource.com/10030 Reviewed-by: Rob Pike --- unix/export_test.go | 7 +++++++ unix/str.go | 6 +++++- unix/syscall_test.go | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 unix/export_test.go diff --git a/unix/export_test.go b/unix/export_test.go new file mode 100644 index 00000000..570aa7ac --- /dev/null +++ b/unix/export_test.go @@ -0,0 +1,7 @@ +// Copyright 2015 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 unix + +var Itoa = itoa diff --git a/unix/str.go b/unix/str.go index f873edec..35ed6643 100644 --- a/unix/str.go +++ b/unix/str.go @@ -8,8 +8,12 @@ package unix 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/unix/syscall_test.go b/unix/syscall_test.go index 9c57d9cd..95eac92a 100644 --- a/unix/syscall_test.go +++ b/unix/syscall_test.go @@ -7,6 +7,7 @@ package unix_test import ( + "fmt" "testing" "golang.org/x/sys/unix" @@ -31,3 +32,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 := unix.Itoa(i) + f := fmt.Sprint(i) + if s != f { + t.Fatalf("itoa(%d) = %s, want %s", i, s, f) + } +}