From 02e9fa9952c6ec6e3e7d4ab110f6631fb8427cbd Mon Sep 17 00:00:00 2001 From: Artur Makutunowicz Date: Wed, 13 Apr 2022 11:59:27 -0700 Subject: [PATCH] Prevent panic if status line is empty in mdstat This change fixes a potential source of panic when the status line in mdstat is empty and the code is trying to reference first item in a zero-sized slice. Signed-off-by: Artur Makutunowicz --- mdstat.go | 6 +++++- mdstat_test.go | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/mdstat.go b/mdstat.go index f0b9e5f75..2c7900f35 100644 --- a/mdstat.go +++ b/mdstat.go @@ -166,8 +166,12 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { } func evalStatusLine(deviceLine, statusLine string) (active, total, down, size int64, err error) { + statusFields := strings.Fields(statusLine) + if len(statusFields) < 1 { + return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q", statusLine) + } - sizeStr := strings.Fields(statusLine)[0] + sizeStr := statusFields[0] size, err = strconv.ParseInt(sizeStr, 10, 64) if err != nil { return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) diff --git a/mdstat_test.go b/mdstat_test.go index d572cb346..871e95ae3 100644 --- a/mdstat_test.go +++ b/mdstat_test.go @@ -56,16 +56,23 @@ func TestFS_MDStat(t *testing.T) { } func TestInvalidMdstat(t *testing.T) { - invalidMount := []byte(` + invalidMount := [][]byte{[]byte(` Personalities : [invalid] md3 : invalid 314159265 blocks 64k chunks unused devices: -`) +`), + []byte(` +md12 : active raid0 sdc2[0] sdd2[1] - _, err := parseMDStat(invalidMount) - if err == nil { - t.Fatalf("parsing of invalid reference file did not find any errors") + 3886394368 blocks super 1.2 512k chunks +`)} + + for _, invalid := range invalidMount { + _, err := parseMDStat(invalid) + if err == nil { + t.Fatalf("parsing of invalid reference file did not find any errors") + } } }