@@ -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