fix(task-archive): 遇到符号链接跳过而非整包失败

归档格式端到端只支持普通文件与目录(解包端对其它类型直接报错),原打包器遇到
任何 symlink 即整包失败(task archive refuses symlink),导致工作目录里一条软链
就卡死整个任务归档。改为跳过该符号链接并记日志:lstat 不跟随、不越出目录树、
不写 symlink 条目;链接指向树内时目标文件仍会被单独遍历归档。安全防护不变。

新增 TestTaskArchivePackageSkipsSymlink 覆盖。
This commit is contained in:
Autumn-27 committed 2026-09-19 11:08:15 -04:00
1 parent 33c26dc72a
commit 37950f4a6f
2 files changed
+39 -1

No files matched your search

+6 -1
View File
@@ -9,6 +9,7 @@ import (
"fmt"
"io"
"io/fs"
"log"
"os"
"path/filepath"
"strconv"
@@ -577,7 +578,11 @@ func writeTaskArchivePackage(path, payloadDir string, snapshot *pgdb.TaskArchive
return err
}
if info.Mode()&os.ModeSymlink != 0 {
return fmt.Errorf("task archive refuses symlink: %s", current)
// 归档格式端到端只支持普通文件与目录(解包端对其它类型直接报错),
// 无法还原符号链接。跳过而非整包失败:不读取链接目标(lstat,不越出目录树),
// 也不写入 symlink 条目;链接指向树内时目标文件本身仍会被单独遍历归档。
log.Printf("[task-archive] 跳过符号链接(归档不支持,不影响其它文件):%s", current)
return nil
}
header, err := tar.FileInfoHeader(info, "")
if err != nil {