



























@@ -162,13 +162,14 @@ export const SANDBOX_PINNED_MUTATION_PYTHON = [
162162" src_stat = os.lstat(src_basename, dir_fd=src_parent_fd)",
163163" if stat.S_ISDIR(src_stat.st_mode) and not stat.S_ISLNK(src_stat.st_mode):",
164164" os.mkdir(dst_basename, stat.S_IMODE(src_stat.st_mode) or 0o755, dir_fd=dst_parent_fd)",
165+" copied_children = []",
165166" src_dir_fd = None",
166167" dst_dir_fd = None",
167168" try:",
168169" src_dir_fd = open_dir(src_basename, dir_fd=src_parent_fd)",
169170" dst_dir_fd = open_dir(dst_basename, dir_fd=dst_parent_fd)",
170171" for child in os.listdir(src_dir_fd):",
171-" copy_entry(src_dir_fd, child, dst_dir_fd, child)",
172+" copied_children.append((child, copy_entry(src_dir_fd, child, dst_dir_fd, child)))",
172173" except Exception:",
173174" if dst_dir_fd is not None:",
174175" os.close(dst_dir_fd)",
@@ -183,11 +184,11 @@ export const SANDBOX_PINNED_MUTATION_PYTHON = [
183184" os.close(src_dir_fd)",
184185" if dst_dir_fd is not None:",
185186" os.close(dst_dir_fd)",
186-" return",
187+" return ('dir', copied_children)",
187188" if stat.S_ISLNK(src_stat.st_mode):",
188189" link_target = os.readlink(src_basename, dir_fd=src_parent_fd)",
189190" os.symlink(link_target, dst_basename, dir_fd=dst_parent_fd)",
190-" return",
191+" return ('leaf', None)",
191192" src_fd = os.open(src_basename, READ_FLAGS, dir_fd=src_parent_fd)",
192193" dst_fd = None",
193194" try:",
@@ -211,6 +212,20 @@ export const SANDBOX_PINNED_MUTATION_PYTHON = [
211212" if dst_fd is not None:",
212213" os.close(dst_fd)",
213214" os.close(src_fd)",
215+" return ('leaf', None)",
216+"",
217+"def remove_copied_entry(parent_fd, basename, manifest):",
218+" kind, children = manifest",
219+" if kind != 'dir':",
220+" os.unlink(basename, dir_fd=parent_fd)",
221+" return",
222+" dir_fd = open_dir(basename, dir_fd=parent_fd)",
223+" try:",
224+" for child, child_manifest in children:",
225+" remove_copied_entry(dir_fd, child, child_manifest)",
226+" finally:",
227+" os.close(dir_fd)",
228+" os.rmdir(basename, dir_fd=parent_fd)",
214229"",
215230"def move_entry(src_parent_fd, src_basename, dst_parent_fd, dst_basename):",
216231" try:",
@@ -224,13 +239,14 @@ export const SANDBOX_PINNED_MUTATION_PYTHON = [
224239" src_stat = os.lstat(src_basename, dir_fd=src_parent_fd)",
225240" if stat.S_ISDIR(src_stat.st_mode) and not stat.S_ISLNK(src_stat.st_mode):",
226241" temp_dir_name = create_temp_dir(dst_parent_fd, dst_basename, stat.S_IMODE(src_stat.st_mode) or 0o755)",
242+" copied_children = []",
227243" temp_dir_fd = None",
228244" src_dir_fd = None",
229245" try:",
230246" temp_dir_fd = open_dir(temp_dir_name, dir_fd=dst_parent_fd)",
231247" src_dir_fd = open_dir(src_basename, dir_fd=src_parent_fd)",
232248" for child in os.listdir(src_dir_fd):",
233-" copy_entry(src_dir_fd, child, temp_dir_fd, child)",
249+" copied_children.append((child, copy_entry(src_dir_fd, child, temp_dir_fd, child)))",
234250" os.close(src_dir_fd)",
235251" src_dir_fd = None",
236252" os.close(temp_dir_fd)",
@@ -246,7 +262,7 @@ export const SANDBOX_PINNED_MUTATION_PYTHON = [
246262" except FileNotFoundError:",
247263" pass",
248264" raise",
249-" remove_tree(src_parent_fd, src_basename)",
265+" remove_copied_entry(src_parent_fd, src_basename, ('dir', copied_children))",
250266" os.fsync(dst_parent_fd)",
251267" os.fsync(src_parent_fd)",
252268" return",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。