fix: EXIF解析越界与转正丢文件、.psb归类、日志接管panic恢复
This commit is contained in:
+14
-6
@@ -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]...)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user