From 9b27d075b6410ee1d80657bfe13cde46cfad33c0 Mon Sep 17 00:00:00 2001 From: Unrud Date: Tue, 7 Mar 2017 17:56:52 +0100 Subject: [PATCH] Always close files when creating collection If an exception occurs we rely on garbage collection to close the files. --- radicale/storage.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/radicale/storage.py b/radicale/storage.py index e38e3c4..58e78b9 100644 --- a/radicale/storage.py +++ b/radicale/storage.py @@ -25,6 +25,7 @@ entry. """ +import contextlib import errno import json import os @@ -583,17 +584,18 @@ class Collection(BaseCollection): uploads them nonatomic and without existence checks. """ - fs = [] - for href, item in vobject_items.items(): - if not is_safe_filesystem_path_component(href): - raise UnsafePathError(href) - path = path_to_filesystem(self._filesystem_path, href) - fs.append(open(path, "w", encoding=self.encoding, newline="")) - fs[-1].write(item.serialize()) - # sync everything at once because it's slightly faster. - for f in fs: - self._fsync(f.fileno()) - f.close() + with contextlib.ExitStack() as stack: + fs = [] + for href, item in vobject_items.items(): + if not is_safe_filesystem_path_component(href): + raise UnsafePathError(href) + path = path_to_filesystem(self._filesystem_path, href) + fs.append(stack.enter_context( + open(path, "w", encoding=self.encoding, newline=""))) + fs[-1].write(item.serialize()) + # sync everything at once because it's slightly faster. + for f in fs: + self._fsync(f.fileno()) self._sync_directory(self._filesystem_path) @classmethod