Recover from any possible taglib panics. Fixes #1343

This commit is contained in:
Deluan 2021-09-20 18:09:39 -04:00
parent 7a15ed0740
commit 76bd20e8ff
2 changed files with 11 additions and 7 deletions

View File

@ -13,18 +13,16 @@ type parsedTags = map[string][]string
func (e *Parser) Parse(paths ...string) (map[string]parsedTags, error) {
fileTags := map[string]parsedTags{}
for _, path := range paths {
tags, err := e.extractMetadata(path)
if err == nil {
fileTags[path] = tags
}
fileTags[path] = e.extractMetadata(path)
}
return fileTags, nil
}
func (e *Parser) extractMetadata(filePath string) (parsedTags, error) {
func (e *Parser) extractMetadata(filePath string) parsedTags {
tags, err := Read(filePath)
if err != nil {
log.Warn("Error reading metadata from file. Skipping", "filePath", filePath, err)
return nil
}
alternativeTags := map[string][]string{
@ -48,5 +46,5 @@ func (e *Parser) extractMetadata(filePath string) (parsedTags, error) {
}
}
}
return tags, nil
return tags
}

View File

@ -20,7 +20,13 @@ import (
"github.com/navidrome/navidrome/log"
)
func Read(filename string) (map[string][]string, error) {
func Read(filename string) (tags map[string][]string, err error) {
defer func() {
if r := recover(); r != nil {
log.Error("TagLib: recovered from panic", "error", r)
err = fmt.Errorf("TagLib: recovered from panic: %s", r)
}
}()
fp := getFilename(filename)
defer C.free(unsafe.Pointer(fp))
id, m := newMap()