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
+4 -6
View File
@@ -13,18 +13,16 @@ type parsedTags = map[string][]string
func (e *Parser) Parse(paths ...string) (map[string]parsedTags, error) { func (e *Parser) Parse(paths ...string) (map[string]parsedTags, error) {
fileTags := map[string]parsedTags{} fileTags := map[string]parsedTags{}
for _, path := range paths { for _, path := range paths {
tags, err := e.extractMetadata(path) fileTags[path] = e.extractMetadata(path)
if err == nil {
fileTags[path] = tags
}
} }
return fileTags, nil return fileTags, nil
} }
func (e *Parser) extractMetadata(filePath string) (parsedTags, error) { func (e *Parser) extractMetadata(filePath string) parsedTags {
tags, err := Read(filePath) tags, err := Read(filePath)
if err != nil { if err != nil {
log.Warn("Error reading metadata from file. Skipping", "filePath", filePath, err) log.Warn("Error reading metadata from file. Skipping", "filePath", filePath, err)
return nil
} }
alternativeTags := map[string][]string{ alternativeTags := map[string][]string{
@@ -48,5 +46,5 @@ func (e *Parser) extractMetadata(filePath string) (parsedTags, error) {
} }
} }
} }
return tags, nil return tags
} }
+7 -1
View File
@@ -20,7 +20,13 @@ import (
"github.com/navidrome/navidrome/log" "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) fp := getFilename(filename)
defer C.free(unsafe.Pointer(fp)) defer C.free(unsafe.Pointer(fp))
id, m := newMap() id, m := newMap()