mirror of https://github.com/etcd-io/bbolt.git
Add check for max mmap size.
The max mmap size was previous unchecked which resulted in a panic once the maximum size was reached. This commit adds a check for the max size when re-mapping and returns an error if the new map will exceed the size. Thanks to Tamás Gulácsi for testing out the change on i386.pull/34/head
parent
a12b668bf7
commit
8374d6adc5
25
db.go
25
db.go
|
@ -162,16 +162,6 @@ func (db *DB) mmap(minsz int) error {
|
|||
db.mmaplock.Lock()
|
||||
defer db.mmaplock.Unlock()
|
||||
|
||||
// Dereference all mmap references before unmapping.
|
||||
if db.rwtx != nil {
|
||||
db.rwtx.root.dereference()
|
||||
}
|
||||
|
||||
// Unmap existing data before continuing.
|
||||
if err := db.munmap(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
info, err := db.file.Stat()
|
||||
if err != nil {
|
||||
return fmt.Errorf("mmap stat error: %s", err)
|
||||
|
@ -186,6 +176,21 @@ func (db *DB) mmap(minsz int) error {
|
|||
}
|
||||
size = db.mmapSize(size)
|
||||
|
||||
// Verify the map size is not above the maximum allowed.
|
||||
if size > maxMapSize {
|
||||
return fmt.Errorf("mmap too large")
|
||||
}
|
||||
|
||||
// Dereference all mmap references before unmapping.
|
||||
if db.rwtx != nil {
|
||||
db.rwtx.root.dereference()
|
||||
}
|
||||
|
||||
// Unmap existing data before continuing.
|
||||
if err := db.munmap(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Memory-map the data file as a byte slice.
|
||||
if err := mmap(db, size); err != nil {
|
||||
return err
|
||||
|
|
Loading…
Reference in New Issue