Commit 61cc8728 authored by Robert Griesemer's avatar Robert Griesemer

encoding/binary: PutX functions require buffer of sufficient size.

R=rsc
CC=golang-dev
https://golang.org/cl/5163041
parent 092a211f
...@@ -37,27 +37,15 @@ const ( ...@@ -37,27 +37,15 @@ const (
) )
// PutUvarint encodes a uint64 into buf and returns the number of bytes written. // 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 { func PutUvarint(buf []byte, x uint64) int {
var i int i := 0
for i = range buf { for x >= 0x80 {
if x < 0x80 {
buf[i] = byte(x)
return i + 1
}
buf[i] = byte(x) | 0x80 buf[i] = byte(x) | 0x80
x >>= 7 x >>= 7
}
// buffer too small; compute number of bytes required
for x >= 0x4000 {
x >>= 2 * 7
i += 2
}
if x >= 0x80 {
i++ i++
} }
return -(i + 1) buf[i] = byte(x)
return i + 1
} }
// Uvarint decodes a uint64 from buf and returns that value and the // Uvarint decodes a uint64 from buf and returns that value and the
...@@ -85,8 +73,6 @@ func Uvarint(buf []byte) (uint64, int) { ...@@ -85,8 +73,6 @@ func Uvarint(buf []byte) (uint64, int) {
} }
// PutVarint encodes an int64 into buf and returns the number of bytes written. // 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 { func PutVarint(buf []byte, x int64) int {
ux := uint64(x) << 1 ux := uint64(x) << 1
if x < 0 { if x < 0 {
...@@ -115,7 +101,7 @@ func Varint(buf []byte) (int64, int) { ...@@ -115,7 +101,7 @@ func Varint(buf []byte) (int64, int) {
// WriteUvarint encodes x and writes the result to w. // WriteUvarint encodes x and writes the result to w.
func WriteUvarint(w io.Writer, x uint64) os.Error { func WriteUvarint(w io.Writer, x uint64) os.Error {
var buf [MaxVarintLen64]byte var buf [MaxVarintLen64]byte
n := PutUvarint(buf[:], x) // won't fail n := PutUvarint(buf[:], x)
_, err := w.Write(buf[0:n]) _, err := w.Write(buf[0:n])
return err return err
} }
......
...@@ -11,7 +11,8 @@ import ( ...@@ -11,7 +11,8 @@ import (
) )
func testConstant(t *testing.T, w uint, max int) { 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 { if n != max {
t.Errorf("MaxVarintLen%d = %d; want %d", w, max, n) t.Errorf("MaxVarintLen%d = %d; want %d", w, max, n)
} }
...@@ -121,18 +122,6 @@ func TestUvarint(t *testing.T) { ...@@ -121,18 +122,6 @@ func TestUvarint(t *testing.T) {
} }
func TestBufferTooSmall(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} buf := []byte{0x80, 0x80, 0x80, 0x80}
for i := 0; i <= len(buf); i++ { for i := 0; i <= len(buf); i++ {
buf := buf[0:i] buf := buf[0:i]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment