@@ -89,6 +89,7 @@ func splitFiles(src []byte) (*fileSet, error) {
8989 if numFiles > limitNumFiles {
9090 return nil, fmt.Errorf("too many files in txtar archive (%v exceeds limit of %v)", numFiles, limitNumFiles)
9191 }
92+ dirFileNameMap := map[string]string{} // holds which filename the dirname is part of
9293 for _, f := range a.Files {
9394 if len(f.Name) > 200 { // arbitrary limit
9495 return nil, errors.New("file name too long")
@@ -111,6 +112,16 @@ func splitFiles(src []byte) (*fileSet, error) {
111112 if fs.Contains(f.Name) {
112113 return nil, fmt.Errorf("duplicate file name %q", f.Name)
113114 }
115+ for i := 1; i < len(parts); i++ {
116+ dirname := path.Join(parts[:i]...)
117+ if fs.Contains(dirname) {
118+ return nil, fmt.Errorf("conflict file/dir name %q and %q", dirname, f.Name)
119+ }
120+ dirFileNameMap[dirname] = f.Name
121+ }
122+ if filename, ok := dirFileNameMap[f.Name]; ok {
123+ return nil, fmt.Errorf("conflict dir/file name %q and %q", filename, f.Name)
124+ }
114125 fs.AddFile(f.Name, f.Data)
115126 }
116127 return fs, nil
0 commit comments