From 3a70401835e869006ab47a0f5c32042bd0ccfee9 Mon Sep 17 00:00:00 2001 From: indraniel Date: Wed, 25 Mar 2015 12:03:59 -0500 Subject: [PATCH] + make copies of the []bytes returned by goleveldb - The byte strings returned by goleveldb aren't necessarily safe. See the following google group thread: https://groups.google.com/forum/#!topic/bleve/aHZ8gmihLiY This code change is based on the gist created here: https://groups.google.com/forum/#!topic/bleve/aHZ8gmihLiY --- index/store/goleveldb/iterator.go | 10 ++++++++-- index/store/goleveldb/store.go | 8 ++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/index/store/goleveldb/iterator.go b/index/store/goleveldb/iterator.go index f067aeb5..2bc7f90c 100644 --- a/index/store/goleveldb/iterator.go +++ b/index/store/goleveldb/iterator.go @@ -59,11 +59,17 @@ func (ldi *Iterator) Current() ([]byte, []byte, bool) { } func (ldi *Iterator) Key() []byte { - return ldi.iterator.Key() + k := ldi.iterator.Key() + rv := make([]byte, len(k)) + copy(rv, k) + return rv } func (ldi *Iterator) Value() []byte { - return ldi.iterator.Value() + v := ldi.iterator.Value() + rv := make([]byte, len(v)) + copy(rv, v) + return rv } func (ldi *Iterator) Valid() bool { diff --git a/index/store/goleveldb/store.go b/index/store/goleveldb/store.go index f4ee0952..f202045c 100644 --- a/index/store/goleveldb/store.go +++ b/index/store/goleveldb/store.go @@ -52,7 +52,9 @@ func (ldbs *Store) get(key []byte) ([]byte, error) { if err == leveldb.ErrNotFound { return nil, nil } - return b, err + rv := make([]byte, len(b)) + copy(rv, b) + return rv, err } func (ldbs *Store) getWithSnapshot(key []byte, snapshot *leveldb.Snapshot) ([]byte, error) { @@ -61,7 +63,9 @@ func (ldbs *Store) getWithSnapshot(key []byte, snapshot *leveldb.Snapshot) ([]by if err == leveldb.ErrNotFound { return nil, nil } - return b, err + rv := make([]byte, len(b)) + copy(rv, b) + return rv, err } func (ldbs *Store) set(key, val []byte) error {