Skip to content

Commit 55a5ed2

Browse files
committed
db: check bounds on level number in options
1 parent dea3594 commit 55a5ed2

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

options.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,11 +2274,13 @@ func (o *Options) Parse(s string, hooks *ParseHooks) error {
22742274
if m == nil {
22752275
return errors.Errorf("pebble: unknown section: %q", errors.Safe(section))
22762276
}
2277-
index, _ := strconv.Atoi(m[1])
2277+
index, err := strconv.Atoi(m[1])
2278+
if err != nil || index < 0 || index >= len(o.Levels) {
2279+
return errors.Errorf("pebble: invalid level index: %q", errors.Safe(m[1]))
2280+
}
22782281

22792282
l := &o.Levels[index]
22802283

2281-
var err error
22822284
switch key {
22832285
case "block_restart_interval":
22842286
l.BlockRestartInterval, err = strconv.Atoi(value)

options_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,36 @@ func TestOptionsParseLevelNoQuotes(t *testing.T) {
461461
require.Equal(t, o1.String(), o2.String())
462462
}
463463

464+
func TestOptionsParseInvalidLevel(t *testing.T) {
465+
str := `
466+
[Options]
467+
[Level 1]
468+
block_restart_interval=8
469+
block_size=10
470+
[Level 10]
471+
block_restart_interval=8
472+
block_size=10
473+
`
474+
o := &Options{}
475+
require.Error(t, o.Parse(str, nil))
476+
477+
str = `
478+
[Options]
479+
[Level -1]
480+
block_restart_interval=8
481+
block_size=10
482+
`
483+
require.Error(t, o.Parse(str, nil))
484+
485+
str = `
486+
[Options]
487+
[Level 100000000000000000000000000]
488+
block_restart_interval=8
489+
block_size=10
490+
`
491+
require.Error(t, o.Parse(str, nil))
492+
}
493+
464494
func TestOptionsParseComparerOverwrite(t *testing.T) {
465495
// Test that an unrecognized comparer in the OPTIONS file does not nil out
466496
// the Comparer field.

0 commit comments

Comments
 (0)