fix: EXIF解析越界与转正丢文件、.psb归类、日志接管panic恢复

This commit is contained in:
2025-05-25 21:01:16 +08:00
parent a2cded251a
commit cf8d991974
3 changed files with 29 additions and 8 deletions
+14 -6
View File
@@ -71,13 +71,21 @@ func RotateImage(ffmpegPath, filePath string) error {
}
}
// 用转正后的文件替换原文件
if err := os.Remove(filePath); err != nil {
// 用转正后的文件替换原文件:先把原文件改名成备份,再让转正结果顶上,最后删备份。
// 这样即使中途失败,原文件也还在(只是改了名),不会弄丢。
backup := filePath + ".rotate.bak"
if err := os.Rename(filePath, backup); err != nil {
_ = os.Remove(tmp)
return fmt.Errorf("备份原文件失败: %v", err)
}
if err := os.Rename(tmp, filePath); err != nil {
// 转正结果放不回去:把备份挪回来尽量恢复原状
_ = os.Rename(backup, filePath)
_ = os.Remove(tmp)
return fmt.Errorf("替换原文件失败: %v", err)
}
if err := os.Rename(tmp, filePath); err != nil {
return fmt.Errorf("替换原文件失败: %v", err)
if err := os.Remove(backup); err != nil {
fmt.Printf("=== 删除原文件备份失败(可手动清理 %s): %v\n", backup, err)
}
return nil
}
@@ -120,7 +128,7 @@ func readExifAPP1(filePath string) ([]byte, error) {
if segLen < 2 {
break
}
if marker == 0xE1 && segLen >= 8 && string(buf[pos+4:pos+8]) == "Exif" {
if marker == 0xE1 && segLen >= 8 && pos+8 <= len(buf) && string(buf[pos+4:pos+8]) == "Exif" {
end := pos + 2 + segLen
if end > len(buf) {
end = len(buf)
@@ -254,7 +262,7 @@ func stripExifAPP1(rest []byte) []byte {
out = append(out, rest[pos:]...)
return out
}
isExif := marker == 0xE1 && segLen >= 8 && string(rest[pos+4:pos+8]) == "Exif"
isExif := marker == 0xE1 && segLen >= 8 && pos+8 <= len(rest) && string(rest[pos+4:pos+8]) == "Exif"
if !isExif {
out = append(out, rest[pos:pos+2+segLen]...)
}