From c1920b330aa2852fb5c6f893c8e35ddf1ca9abe7 Mon Sep 17 00:00:00 2001 From: Jana Cupova Date: Feb 07 2022 09:12:57 +0000 Subject: Write signed copies atomically Fixes: https://pagure.io/koji/issue/3097 --- diff --git a/koji/__init__.py b/koji/__init__.py index 33071ef..a3fe326 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -959,21 +959,26 @@ def get_sighdr_key(sighdr): def splice_rpm_sighdr(sighdr, src, dst=None, bufsize=8192): """Write a copy of an rpm with signature header spliced in""" (start, size) = find_rpm_sighdr(src) - if dst is None: - (fd, dst) = tempfile.mkstemp() - os.close(fd) - src_fo = open(src, 'rb') - dst_fo = open(dst, 'wb') - dst_fo.write(src_fo.read(start)) - dst_fo.write(sighdr) - src_fo.seek(size, 1) - while True: - buf = src_fo.read(bufsize) - if not buf: - break - dst_fo.write(buf) - src_fo.close() - dst_fo.close() + if dst is not None: + dirname = os.path.dirname(dst) + os.makedirs(dirname) + (fd, dst_temp) = tempfile.mkstemp(dir=dirname) + else: + (fd, dst_temp) = tempfile.mkstemp() + os.close(fd) + with open(src, 'rb') as src_fo, open(dst_temp, 'wb') as dst_fo: + dst_fo.write(src_fo.read(start)) + dst_fo.write(sighdr) + src_fo.seek(size, 1) + while True: + buf = src_fo.read(bufsize) + if not buf: + break + dst_fo.write(buf) + if dst is not None: + os.rename(dst_temp, dst) + else: + dst = dst_temp return dst