]> Cypherpunks repositories - gostls13.git/commitdiff
fmt: fix buffer underflow for negative integers
authorHåvard Haugen <havard.haugen@gmail.com>
Mon, 25 May 2015 21:14:35 +0000 (23:14 +0200)
committerRob Pike <r@golang.org>
Tue, 2 Jun 2015 13:55:40 +0000 (13:55 +0000)
Allow room for the initial minus sign of negative integers when
computing widths.

Fixes #10945.

Change-Id: I04d80203aaff64611992725d613ec13ed2ae721f
Reviewed-on: https://go-review.googlesource.com/10393
Reviewed-by: Rob Pike <r@golang.org>
src/fmt/fmt_test.go
src/fmt/format.go

index 93121bb3d032c4760c3a1761f86d5d32cc200052..059d09e1bfa3002dd60a273e95c3ab3e1c12e700 100644 (file)
@@ -557,10 +557,11 @@ var fmtTests = []struct {
        {"%0.100f", 1.0, zeroFill("1.", 100, "")},
        {"%0.100f", -1.0, zeroFill("-1.", 100, "")},
 
-       // Used to panic: integer function didn't look at f.prec or f.unicode or f.width.
+       // Used to panic: integer function didn't look at f.prec, f.unicode, f.width or sign.
        {"%#.80x", 42, "0x0000000000000000000000000000000000000000000000000000000000000000000000000000002a"},
        {"%.80U", 42, "U+0000000000000000000000000000000000000000000000000000000000000000000000000000002A"},
        {"%#.80U", '日', "U+000000000000000000000000000000000000000000000000000000000000000000000000000065E5 '日'"},
+       {"%.65d", -44, "-00000000000000000000000000000000000000000000000000000000000000044"},
        {"%+.65d", 44, "+00000000000000000000000000000000000000000000000000000000000000044"},
        {"% .65d", 44, " 00000000000000000000000000000000000000000000000000000000000000044"},
        {"%  +.65d", 44, "+00000000000000000000000000000000000000000000000000000000000000044"},
index ba984cf84f946f40584f078d1092697d29353ee7..ac9f6d881a2312fab1e4b5ce1692ed7e9ea09bf0 100644 (file)
@@ -162,6 +162,11 @@ func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) {
                return
        }
 
+       negative := signedness == signed && a < 0
+       if negative {
+               a = -a
+       }
+
        var buf []byte = f.intbuf[0:]
        if f.widPresent || f.precPresent || f.plus || f.space {
                width := f.wid + f.prec // Only one will be set, both are positive; this provides the maximum.
@@ -177,9 +182,7 @@ func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) {
                                width += 1 + 1 + utf8.UTFMax + 1
                        }
                }
-               if f.plus {
-                       width++
-               } else if f.space {
+               if negative || f.plus || f.space {
                        width++
                }
                if width > nByte {
@@ -188,11 +191,6 @@ func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) {
                }
        }
 
-       negative := signedness == signed && a < 0
-       if negative {
-               a = -a
-       }
-
        // two ways to ask for extra leading zero digits: %.3d or %03d.
        // apparently the first cancels the second.
        prec := 0