Skip to content

Commit

Permalink
bucket: allow to allocate key on stack in Put()
Browse files Browse the repository at this point in the history
As per `go build -gcflags -m ./... 2>&1`:

Old behaviour:
```
./bucket.go:148:31: leaking param: key
./bucket.go:192:42: leaking param: key
./bucket.go:271:22: leaking param: key
```

Now:
```
./bucket.go:148:31: key does not escape
./bucket.go:192:42: key does not escape
./bucket.go:271:22: key does not escape
```

Signed-off-by: Evgenii Stratonikov <[email protected]>
(cherry picked from commit 71a59ca)
Signed-off-by: Wei Fu <[email protected]>
  • Loading branch information
fyfyrchik authored and fuweid committed Dec 14, 2023
1 parent defa564 commit 0a521c0
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,15 +183,17 @@ func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) {
var value = bucket.write()

// Insert into node.
key = cloneBytes(key)
c.node().put(key, key, value, 0, bucketLeafFlag)
// Tip: Use a new variable `newKey` instead of reusing the existing `key` to prevent
// it from being marked as leaking, and accordingly cannot be allocated on stack.
newKey := cloneBytes(key)
c.node().put(newKey, newKey, value, 0, bucketLeafFlag)

// Since subbuckets are not allowed on inline buckets, we need to
// dereference the inline page, if it exists. This will cause the bucket
// to be treated as a regular, non-inline bucket for the rest of the tx.
b.page = nil

return b.Bucket(key), nil
return b.Bucket(newKey), nil
}

// CreateBucketIfNotExists creates a new bucket if it doesn't already exist and returns a reference to it.
Expand Down Expand Up @@ -298,8 +300,10 @@ func (b *Bucket) Put(key []byte, value []byte) error {
}

// Insert into node.
key = cloneBytes(key)
c.node().put(key, key, value, 0, 0)
// Tip: Use a new variable `newKey` instead of reusing the existing `key` to prevent
// it from being marked as leaking, and accordingly cannot be allocated on stack.
newKey := cloneBytes(key)
c.node().put(newKey, newKey, value, 0, 0)

return nil
}
Expand Down

0 comments on commit 0a521c0

Please sign in to comment.