in txtar.go [80:117]
func splitFiles(src []byte) (*fileSet, error) {
fs := new(fileSet)
a := txtar.Parse(src)
if v := bytes.TrimSpace(a.Comment); len(v) > 0 {
fs.noHeader = true
fs.AddFile(progName, a.Comment)
}
const limitNumFiles = 20 // arbitrary
numFiles := len(a.Files) + fs.Num()
if numFiles > limitNumFiles {
return nil, fmt.Errorf("too many files in txtar archive (%v exceeds limit of %v)", numFiles, limitNumFiles)
}
for _, f := range a.Files {
if len(f.Name) > 200 { // arbitrary limit
return nil, errors.New("file name too long")
}
if strings.IndexFunc(f.Name, isBogusFilenameRune) != -1 {
return nil, fmt.Errorf("invalid file name %q", f.Name)
}
if f.Name != path.Clean(f.Name) || path.IsAbs(f.Name) {
return nil, fmt.Errorf("invalid file name %q", f.Name)
}
parts := strings.Split(f.Name, "/")
if len(parts) > 10 { // arbitrary limit
return nil, fmt.Errorf("file name %q too deep", f.Name)
}
for _, part := range parts {
if part == "." || part == ".." {
return nil, fmt.Errorf("invalid file name %q", f.Name)
}
}
if fs.Contains(f.Name) {
return nil, fmt.Errorf("duplicate file name %q", f.Name)
}
fs.AddFile(f.Name, f.Data)
}
return fs, nil
}