From 35ae9246d62346170a017014b40f64ee91025c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeff=2EJF=20Lin=28=E6=9E=97=E5=8B=81=E7=94=AB=29?= Date: Wed, 21 Oct 2020 17:06:43 +0800 Subject: [PATCH] fix open encrypted file OOM bug, return FileIsEncrpytedErr if file is encrypted --- Encrypted.xls | Bin 0 -> 25600 bytes workbook.go | 25 ++++++++++++++++++++----- xls.go | 2 +- xls_test.go | 6 ++++++ 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 Encrypted.xls diff --git a/Encrypted.xls b/Encrypted.xls new file mode 100644 index 0000000000000000000000000000000000000000..12927f2263feddd94d3afac9c2d960d7c06c8096 GIT binary patch literal 25600 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 I|MdS~0N6ORO#lD@ literal 0 HcmV?d00001 diff --git a/workbook.go b/workbook.go index f917d53..82df4da 100644 --- a/workbook.go +++ b/workbook.go @@ -3,12 +3,16 @@ package xls import ( "bytes" "encoding/binary" - "golang.org/x/text/encoding/charmap" + "errors" "io" "os" "unicode/utf16" + + "golang.org/x/text/encoding/charmap" ) +var FileIsEncryptedError = errors.New("File is encrypted") + //xls workbook type type WorkBook struct { Is5ver bool @@ -29,28 +33,39 @@ type WorkBook struct { } //read workbook from ole2 file -func newWorkBookFromOle2(rs io.ReadSeeker) *WorkBook { +func newWorkBookFromOle2(rs io.ReadSeeker) (*WorkBook, error) { wb := new(WorkBook) wb.Formats = make(map[uint16]*Format) // wb.bts = bts wb.rs = rs wb.sheets = make([]*WorkSheet, 0) - wb.Parse(rs) - return wb + if err := wb.Parse(rs); err != nil { + return nil, err + } + return wb, nil } -func (w *WorkBook) Parse(buf io.ReadSeeker) { +func (w *WorkBook) Parse(buf io.ReadSeeker) error { b := new(bof) bof_pre := new(bof) // buf := bytes.NewReader(bts) offset := 0 for { if err := binary.Read(buf, binary.LittleEndian, b); err == nil { + // if read in a FilePass record which indicated by 0x2f, then thisl file is encrypted. + // return FileIsEncryptedError here because we still aren't able to decode the file now. + // ref: https://stackoverflow.com/questions/25422599/parse-xls-file-with-protected-protected-workbook + // https://www.openoffice.org/sc/excelfileformat.pdf + if b.Id == 0x2f { + return FileIsEncryptedError + } bof_pre, b, offset = w.parseBof(buf, b, bof_pre, offset) } else { break } } + + return nil } func (w *WorkBook) addXf(xf st_xf_data) { diff --git a/xls.go b/xls.go index 158d749..49eff16 100644 --- a/xls.go +++ b/xls.go @@ -52,7 +52,7 @@ func OpenReader(reader io.ReadSeeker, charset string) (wb *WorkBook, err error) } } if book != nil { - wb = newWorkBookFromOle2(ole.OpenFile(book, root)) + wb, err = newWorkBookFromOle2(ole.OpenFile(book, root)) return } } diff --git a/xls_test.go b/xls_test.go index 57c809c..a46b8c8 100644 --- a/xls_test.go +++ b/xls_test.go @@ -3,8 +3,14 @@ package xls import ( "fmt" "testing" + + "github.com/stretchr/testify/assert" ) +func TestOpenEncryptedFile(t *testing.T) { + _, err := Open("Encrypted.xls", "utf-8") + assert.Equal(t, FileIsEncryptedError, err) +} func TestOpen(t *testing.T) { if xlFile, err := Open("t1.xls", "utf-8"); err == nil { if sheet1 := xlFile.GetSheet(0); sheet1 != nil {