Skip to content

Commit 7ede8f2

Browse files
committed
FIX: Avoid directory clobber during zip extraction
1 parent b172865 commit 7ede8f2

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

templateflow/conf/_s3.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,23 +80,28 @@ def _update_skeleton(skel_file, dest, overwrite=True, silent=False):
8080
dest = Path(dest)
8181
dest.mkdir(exist_ok=True, parents=True)
8282
with ZipFile(skel_file, 'r') as zipref:
83+
allfiles = sorted(zipref.namelist())
84+
8385
if overwrite:
84-
zipref.extractall(str(dest))
85-
return True
86+
newfiles = allfiles
87+
else:
88+
current_files = [s.relative_to(dest) for s in dest.glob('**/*')]
89+
existing = sorted({'%s/' % s.parent for s in current_files}) + [
90+
str(s) for s in current_files
91+
]
92+
newfiles = sorted(set(allfiles) - set(existing))
8693

87-
allfiles = zipref.namelist()
88-
current_files = [s.relative_to(dest) for s in dest.glob('**/*')]
89-
existing = sorted({'%s/' % s.parent for s in current_files}) + [
90-
str(s) for s in current_files
91-
]
92-
newfiles = sorted(set(allfiles) - set(existing))
9394
if newfiles:
9495
if not silent:
9596
print(
9697
'Updating TEMPLATEFLOW_HOME using S3. Adding:\n%s'
9798
% '\n'.join(newfiles)
9899
)
99-
zipref.extractall(str(dest), members=newfiles)
100+
for fl in newfiles:
101+
localpath = dest / fl
102+
if localpath.is_dir(): # avoid extracting existing directories
103+
continue
104+
zipref.extract(fl, path=dest)
100105
return True
101106
if not silent:
102107
print('TEMPLATEFLOW_HOME directory (S3 type) was up-to-date.')

0 commit comments

Comments
 (0)