Skip to content

Commit 6c0651a

Browse files
committed
tar.py: Fix hardlink extraction with latest Python
Recent Python security fixes (included in 3.13.4 but also backported to older branches) require link targets to pass the specified filter function as well. This can result in hardlinked files to not be extracted when a `base-dir` is set. This commit separates the filtering from the extraction to avoid this issue. Pass `filter="tar"` as Python 3.14+ will default to the too restrictive `filter="data"`. python/cpython#135037 Fixes #2029.
1 parent 360eb71 commit 6c0651a

File tree

1 file changed

+6
-6
lines changed
  • src/buildstream/plugins/sources

1 file changed

+6
-6
lines changed

src/buildstream/plugins/sources/tar.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,14 @@ def stage(self, directory):
145145
base_dir = base_dir + os.sep
146146

147147
filter_function = functools.partial(self._extract_filter, base_dir)
148+
filtered_members = []
149+
for member in tar.getmembers():
150+
member = filter_function(member, directory)
151+
if member is not None:
152+
filtered_members.append(member)
148153
if sys.version_info >= (3, 12):
149-
tar.extractall(path=directory, filter=filter_function)
154+
tar.extractall(path=directory, members=filtered_members, filter="tar")
150155
else:
151-
filtered_members = []
152-
for member in tar.getmembers():
153-
member = filter_function(member, directory)
154-
if member is not None:
155-
filtered_members.append(member)
156156
tar.extractall(path=directory, members=filtered_members)
157157

158158
except (tarfile.TarError, OSError) as e:

0 commit comments

Comments
 (0)