@@ -17,6 +17,7 @@ package utils
17
17
import (
18
18
"archive/tar"
19
19
"compress/gzip"
20
+ "errors"
20
21
"fmt"
21
22
"io"
22
23
"os"
@@ -32,10 +33,10 @@ func ExtractTarGz(gzipStream io.Reader, destDir string) error {
32
33
33
34
tarReader := tar .NewReader (uncompressedStream )
34
35
35
- for true {
36
+ for {
36
37
header , err := tarReader .Next ()
37
38
38
- if err == io .EOF {
39
+ if errors . Is ( err , io .EOF ) {
39
40
break
40
41
}
41
42
@@ -45,16 +46,19 @@ func ExtractTarGz(gzipStream io.Reader, destDir string) error {
45
46
46
47
switch header .Typeflag {
47
48
case tar .TypeDir :
48
- return fmt .Errorf ("unexepected dir inside the archive. Expected to find only files without any tree structure. " )
49
+ return fmt .Errorf ("unexepected dir inside the archive, expected to find only files without any tree structure" )
49
50
case tar .TypeReg :
50
- outFile , err := os .Create (filepath .Join (destDir , header .Name ))
51
+ outFile , err := os .Create (filepath .Clean ( filepath . Join (destDir , filepath . Clean ( header .Name )) ))
51
52
if err != nil {
52
53
return err
53
54
}
54
- if _ , err := io .Copy (outFile , tarReader ); err != nil {
55
+ if err := copyInChunks (outFile , tarReader ); err != nil {
56
+ return err
57
+ }
58
+ err = outFile .Close ()
59
+ if err != nil {
55
60
return err
56
61
}
57
- outFile .Close ()
58
62
59
63
default :
60
64
return fmt .Errorf ("extractTarGz: uknown type: %b in %s" , header .Typeflag , header .Name )
@@ -63,3 +67,17 @@ func ExtractTarGz(gzipStream io.Reader, destDir string) error {
63
67
64
68
return nil
65
69
}
70
+
71
+ func copyInChunks (dst io.Writer , src io.Reader ) error {
72
+ for {
73
+ _ , err := io .CopyN (dst , src , 1024 )
74
+ if err != nil {
75
+ if errors .Is (err , io .EOF ) {
76
+ break
77
+ }
78
+ return err
79
+ }
80
+ }
81
+
82
+ return nil
83
+ }
0 commit comments