@@ -89,6 +89,7 @@ func splitFiles(src []byte) (*fileSet, error) {
89
89
if numFiles > limitNumFiles {
90
90
return nil , fmt .Errorf ("too many files in txtar archive (%v exceeds limit of %v)" , numFiles , limitNumFiles )
91
91
}
92
+ dirFileNameMap := map [string ]string {} // holds which filename the dirname is part of
92
93
for _ , f := range a .Files {
93
94
if len (f .Name ) > 200 { // arbitrary limit
94
95
return nil , errors .New ("file name too long" )
@@ -111,6 +112,16 @@ func splitFiles(src []byte) (*fileSet, error) {
111
112
if fs .Contains (f .Name ) {
112
113
return nil , fmt .Errorf ("duplicate file name %q" , f .Name )
113
114
}
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
+ }
114
125
fs .AddFile (f .Name , f .Data )
115
126
}
116
127
return fs , nil
0 commit comments