]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/binary: PutX functions require buffer of sufficient size.
authorRobert Griesemer <gri@golang.org>
Thu, 29 Sep 2011 16:40:59 +0000 (09:40 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 29 Sep 2011 16:40:59 +0000 (09:40 -0700)
R=rsc
CC=golang-dev
https://golang.org/cl/5163041

src/pkg/encoding/binary/varint.go
src/pkg/encoding/binary/varint_test.go

index 1439dd3faae1fc1020c7416f82f6c53b0d172463..c98e0e2bf575baa3ae0085e9eee0075dcf869802 100644 (file)
@@ -37,27 +37,15 @@ const (
 )
 
 // PutUvarint encodes a uint64 into buf and returns the number of bytes written.
-// If the buffer is too small, the result is the negated number of bytes required
-// (that is, -PutUvarint(nil, x) is the number of bytes required to encode x).
 func PutUvarint(buf []byte, x uint64) int {
-       var i int
-       for i = range buf {
-               if x < 0x80 {
-                       buf[i] = byte(x)
-                       return i + 1
-               }
+       i := 0
+       for x >= 0x80 {
                buf[i] = byte(x) | 0x80
                x >>= 7
-       }
-       // buffer too small; compute number of bytes required
-       for x >= 0x4000 {
-               x >>= 2 * 7
-               i += 2
-       }
-       if x >= 0x80 {
                i++
        }
-       return -(i + 1)
+       buf[i] = byte(x)
+       return i + 1
 }
 
 // Uvarint decodes a uint64 from buf and returns that value and the
@@ -85,8 +73,6 @@ func Uvarint(buf []byte) (uint64, int) {
 }
 
 // PutVarint encodes an int64 into buf and returns the number of bytes written.
-// If the buffer is too small, the result is the negated number of bytes required
-// (that is, -PutVarint(nil, x) is the number of bytes required to encode x).
 func PutVarint(buf []byte, x int64) int {
        ux := uint64(x) << 1
        if x < 0 {
@@ -115,7 +101,7 @@ func Varint(buf []byte) (int64, int) {
 // WriteUvarint encodes x and writes the result to w.
 func WriteUvarint(w io.Writer, x uint64) os.Error {
        var buf [MaxVarintLen64]byte
-       n := PutUvarint(buf[:], x) // won't fail
+       n := PutUvarint(buf[:], x)
        _, err := w.Write(buf[0:n])
        return err
 }
index a85aceeeac60d2da0da24975e5451889d7e008ef..1ceb4cd4b1257e40ad727e034f16e1065cd2fc0e 100644 (file)
@@ -11,7 +11,8 @@ import (
 )
 
 func testConstant(t *testing.T, w uint, max int) {
-       n := -PutUvarint(nil, 1<<w-1)
+       var buf [MaxVarintLen64]byte
+       n := PutUvarint(buf[:], 1<<w-1)
        if n != max {
                t.Errorf("MaxVarintLen%d = %d; want %d", w, max, n)
        }
@@ -121,18 +122,6 @@ func TestUvarint(t *testing.T) {
 }
 
 func TestBufferTooSmall(t *testing.T) {
-       for i := 0; i < 10; i++ {
-               buf := make([]byte, i)
-               x := uint64(1) << (uint(i) * 7)
-               n0 := -i
-               if i == 0 {
-                       n0 = -1 // encoding 0 takes one byte
-               }
-               if n := PutUvarint(buf, x); n != n0 {
-                       t.Errorf("PutUvarint([%d]byte, %d): got n = %d; want %d", len(buf), x, n, n0)
-               }
-       }
-
        buf := []byte{0x80, 0x80, 0x80, 0x80}
        for i := 0; i <= len(buf); i++ {
                buf := buf[0:i]