v2ray 9 лет назад
Родитель
Сommit
9523cb3ec3
2 измененных файлов с 12 добавлено и 8 удалено
  1. 11 2
      common/alloc/buffer.go
  2. 1 6
      common/alloc/buffer_pool.go

+ 11 - 2
common/alloc/buffer.go

@@ -21,9 +21,18 @@ type Buffer struct {
 	offset int
 }
 
+func CreateBuffer(container []byte, parent *BufferPool) *Buffer {
+	b := new(Buffer)
+	b.head = container
+	b.pool = parent
+	b.Value = b.head[defaultOffset:]
+	b.offset = defaultOffset
+	return b
+}
+
 // Release recycles the buffer into an internal buffer pool.
 func (b *Buffer) Release() {
-	if b == nil {
+	if b == nil || b.head == nil {
 		return
 	}
 	b.pool.Free(b)
@@ -122,7 +131,7 @@ func (b *Buffer) SliceFrom(from int) *Buffer {
 func (b *Buffer) SliceBack(offset int) *Buffer {
 	newoffset := b.offset - offset
 	if newoffset < 0 {
-		newoffset = 0
+		panic("Negative buffer offset.")
 	}
 	b.Value = b.head[newoffset : b.offset+len(b.Value)]
 	b.offset = newoffset

+ 1 - 6
common/alloc/buffer_pool.go

@@ -29,12 +29,7 @@ func (p *BufferPool) Allocate() *Buffer {
 	default:
 		b = p.allocator.Get().([]byte)
 	}
-	return &Buffer{
-		head:   b,
-		pool:   p,
-		Value:  b[defaultOffset:],
-		offset: defaultOffset,
-	}
+	return CreateBuffer(b, p)
 }
 
 func (p *BufferPool) Free(buffer *Buffer) {