@@ -122,3 +122,67 @@ func TestUnpackLayer(t *testing.T) {
122122 t .Fatal (err )
123123 }
124124}
125+
126+ func TestUnpackLayerRemovePartialyUnpackedFile (t * testing.T ) {
127+ // generate a tar file has duplicate entry which will failed on unpacking
128+ tmp1 , err := ioutil .TempDir ("" , "test-layer" )
129+ if err != nil {
130+ t .Fatal (err )
131+ }
132+ defer os .RemoveAll (tmp1 )
133+ err = os .MkdirAll (filepath .Join (tmp1 , "blobs" , "sha256" ), 0700 )
134+ if err != nil {
135+ t .Fatal (err )
136+ }
137+ tarfile := filepath .Join (tmp1 , "blobs" , "sha256" , "test.tar" )
138+ f , err := os .Create (tarfile )
139+ if err != nil {
140+ t .Fatal (err )
141+ }
142+
143+ gw := gzip .NewWriter (f )
144+ tw := tar .NewWriter (gw )
145+
146+ tw .WriteHeader (& tar.Header {Name : "test" , Size : 4 , Mode : 0600 })
147+ io .Copy (tw , bytes .NewReader ([]byte ("test" )))
148+ tw .WriteHeader (& tar.Header {Name : "test" , Size : 5 , Mode : 0600 })
149+ io .Copy (tw , bytes .NewReader ([]byte ("test1" )))
150+ tw .Close ()
151+ gw .Close ()
152+ f .Close ()
153+
154+ // generate sha256 hash
155+ h := sha256 .New ()
156+ file , err := os .Open (tarfile )
157+ if err != nil {
158+ t .Fatal (err )
159+ }
160+ defer file .Close ()
161+ _ , err = io .Copy (h , file )
162+ if err != nil {
163+ t .Fatal (err )
164+ }
165+ err = os .Rename (tarfile , filepath .Join (tmp1 , "blobs" , "sha256" , fmt .Sprintf ("%x" , h .Sum (nil ))))
166+ if err != nil {
167+ t .Fatal (err )
168+ }
169+
170+ testManifest := manifest {
171+ Layers : []descriptor {descriptor {
172+ MediaType : "application/vnd.oci.image.layer.tar+gzip" ,
173+ Digest : fmt .Sprintf ("sha256:%s" , fmt .Sprintf ("%x" , h .Sum (nil ))),
174+ }},
175+ }
176+ err = testManifest .unpack (newPathWalker (tmp1 ), filepath .Join (tmp1 , "rootfs" ))
177+ if err != nil && ! strings .Contains (err .Error (), "duplicate entry for" ) {
178+ t .Fatal (err )
179+ }
180+
181+ _ , err = os .Stat (filepath .Join (tmp1 , "rootfs" ))
182+ if err != nil && ! os .IsNotExist (err ) {
183+ t .Fatal (err )
184+ }
185+ if err == nil {
186+ t .Fatal ("Execpt partialy unpacked file has been removed" )
187+ }
188+ }
0 commit comments