@@ -35,7 +35,7 @@ func Copy(ctx context.Context, dst io.Writer, src io.Reader) (int64, error) {
3535
3636// copyReader copies from an io.Reader into a file, using umask to create the dst file
3737func copyReader (dst string , src io.Reader , fmode , umask os.FileMode , fileSizeLimit int64 ) error {
38- dstF , err := os .OpenFile (dst , os .O_RDWR | os .O_CREATE | os .O_TRUNC , fmode )
38+ dstF , err := os .OpenFile (dst , os .O_RDWR | os .O_CREATE | os .O_TRUNC , mode ( fmode , umask ) )
3939 if err != nil {
4040 return err
4141 }
@@ -47,6 +47,9 @@ func copyReader(dst string, src io.Reader, fmode, umask os.FileMode, fileSizeLim
4747
4848 _ , err = io .Copy (dstF , src )
4949 if err != nil {
50+ // Close & remove the file in case of partial write
51+ _ = dstF .Close ()
52+ _ = os .Remove (dst )
5053 return err
5154 }
5255
@@ -74,14 +77,17 @@ func copyFile(ctx context.Context, dst, src string, disableSymlinks bool, fmode,
7477 }
7578 defer func () { _ = srcF .Close () }()
7679
77- dstF , err := os .OpenFile (dst , os .O_RDWR | os .O_CREATE | os .O_TRUNC , fmode )
80+ dstF , err := os .OpenFile (dst , os .O_RDWR | os .O_CREATE | os .O_TRUNC , mode ( fmode , umask ) )
7881 if err != nil {
7982 return 0 , err
8083 }
8184 defer func () { _ = dstF .Close () }()
8285
8386 count , err := Copy (ctx , dstF , srcF )
8487 if err != nil {
88+ // Close & remove the file in case of partial write
89+ _ = dstF .Close ()
90+ _ = os .Remove (dst )
8591 return 0 , err
8692 }
8793
0 commit comments