Skip to content

Commit

Permalink
Fix panic caused by the workbook relationship part not exist (qax-os#…
Browse files Browse the repository at this point in the history
…1443)

- Check nil map in the getSheetMap function
- Update unit tests
  • Loading branch information
liron-l authored Jan 11, 2023
1 parent ee66135 commit baf5e0e
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 7 deletions.
30 changes: 23 additions & 7 deletions excelize_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,36 +228,52 @@ func TestOpenReader(t *testing.T) {
_, err = OpenReader(bytes.NewReader(oleIdentifier), Options{Password: "password", UnzipXMLSizeLimit: UnzipSizeLimit + 1})
assert.EqualError(t, err, ErrWorkbookFileFormat.Error())

// Test open workbook with unsupported charset internal calculation chain
preset := func(filePath string) *bytes.Buffer {
// Prepare unusual workbook, made the specified internal XML parts missing
// or contain unsupported charset
preset := func(filePath string, notExist bool) *bytes.Buffer {
source, err := zip.OpenReader(filepath.Join("test", "Book1.xlsx"))
assert.NoError(t, err)
buf := new(bytes.Buffer)
zw := zip.NewWriter(buf)
for _, item := range source.File {
// The following statements can be simplified as zw.Copy(item) in go1.17
if notExist && item.Name == filePath {
continue
}
writer, err := zw.Create(item.Name)
assert.NoError(t, err)
readerCloser, err := item.Open()
assert.NoError(t, err)
_, err = io.Copy(writer, readerCloser)
assert.NoError(t, err)
}
fi, err := zw.Create(filePath)
assert.NoError(t, err)
_, err = fi.Write(MacintoshCyrillicCharset)
assert.NoError(t, err)
if !notExist {
fi, err := zw.Create(filePath)
assert.NoError(t, err)
_, err = fi.Write(MacintoshCyrillicCharset)
assert.NoError(t, err)
}
assert.NoError(t, zw.Close())
return buf
}
// Test open workbook with unsupported charset internal XML parts
for _, defaultXMLPath := range []string{
defaultXMLPathCalcChain,
defaultXMLPathStyles,
defaultXMLPathWorkbookRels,
} {
_, err = OpenReader(preset(defaultXMLPath))
_, err = OpenReader(preset(defaultXMLPath, false))
assert.EqualError(t, err, "XML syntax error on line 1: invalid UTF-8")
}
// Test open workbook without internal XML parts
for _, defaultXMLPath := range []string{
defaultXMLPathCalcChain,
defaultXMLPathStyles,
defaultXMLPathWorkbookRels,
} {
_, err = OpenReader(preset(defaultXMLPath, true))
assert.NoError(t, err)
}

// Test open spreadsheet with unzip size limit
_, err = OpenFile(filepath.Join("test", "Book1.xlsx"), Options{UnzipSizeLimit: 100})
Expand Down
3 changes: 3 additions & 0 deletions sheet.go
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,9 @@ func (f *File) getSheetMap() (map[string]string, error) {
if err != nil {
return nil, err
}
if rels == nil {
return maps, nil
}
for _, v := range wb.Sheets.Sheet {
for _, rel := range rels.Relationships {
if rel.ID == v.ID {
Expand Down

0 comments on commit baf5e0e

Please sign in to comment.