Skip to content

Commit f18b62a

Browse files
committed
Fix use-after-free of pooled value buffers in bbolt Batch writes
1 parent 6afdbd9 commit f18b62a

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

experimental/cachefile/dns_cache.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ func (c *CacheFile) LoadDNSCache(transportName string, qName string, qType uint1
5252
}
5353

5454
func (c *CacheFile) SaveDNSCache(transportName string, qName string, qType uint16, rawMessage []byte, expireAt time.Time) error {
55+
value := buf.Get(8 + len(rawMessage))
56+
defer buf.Put(value)
57+
binary.BigEndian.PutUint64(value[:8], uint64(expireAt.Unix()))
58+
copy(value[8:], rawMessage)
5559
return c.batch(func(tx *bbolt.Tx) error {
5660
bucket, err := c.createBucket(tx, bucketDNSCache)
5761
if err != nil {
@@ -65,10 +69,6 @@ func (c *CacheFile) SaveDNSCache(transportName string, qName string, qType uint1
6569
binary.BigEndian.PutUint16(key, qType)
6670
copy(key[2:], qName)
6771
defer buf.Put(key)
68-
value := buf.Get(8 + len(rawMessage))
69-
defer buf.Put(value)
70-
binary.BigEndian.PutUint64(value[:8], uint64(expireAt.Unix()))
71-
copy(value[8:], rawMessage)
7272
return bucket.Put(key, value)
7373
})
7474
}

experimental/cachefile/rdrc.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ func (c *CacheFile) LoadRDRC(transportName string, qName string, qType uint16) (
7272
}
7373

7474
func (c *CacheFile) SaveRDRC(transportName string, qName string, qType uint16) error {
75+
expiresAt := buf.Get(8)
76+
defer buf.Put(expiresAt)
77+
binary.BigEndian.PutUint64(expiresAt, uint64(time.Now().Add(c.rdrcTimeout).Unix()))
7578
return c.batch(func(tx *bbolt.Tx) error {
7679
bucket, err := c.createBucket(tx, bucketRDRC)
7780
if err != nil {
@@ -85,9 +88,6 @@ func (c *CacheFile) SaveRDRC(transportName string, qName string, qType uint16) e
8588
binary.BigEndian.PutUint16(key, qType)
8689
copy(key[2:], qName)
8790
defer buf.Put(key)
88-
expiresAt := buf.Get(8)
89-
defer buf.Put(expiresAt)
90-
binary.BigEndian.PutUint64(expiresAt, uint64(time.Now().Add(c.rdrcTimeout).Unix()))
9191
return bucket.Put(key, expiresAt)
9292
})
9393
}

0 commit comments

Comments
 (0)