From 32fc2c1d0ba5ad8ef1f223c1ae8a985d3dcdc8cf Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Mon, 24 Sep 2007 20:26:09 +0000 Subject: [PATCH] Bug #190179 - Use `prelink --verify filename` to write the temp file via stdout since --undo fails when run as a normal non-superuser because it tries to chown the output file. Also, use mkstemp() to eliminate the need for locking the temp file. Thanks to Israel G. Lugo for the initial patch. svn path=/main/trunk/; revision=7801 --- pym/portage/checksum.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pym/portage/checksum.py b/pym/portage/checksum.py index fa00247ab..c663b68d9 100644 --- a/pym/portage/checksum.py +++ b/pym/portage/checksum.py @@ -7,6 +7,7 @@ from portage.const import PRIVATE_PATH,PRELINK_BINARY,HASHING_BLOCKSIZE import os import errno import stat +import tempfile import portage.exception import portage.process import portage.locks @@ -198,16 +199,19 @@ def perform_checksum(filename, hashname="MD5", calc_prelink=0): """ global prelink_capable myfilename = filename[:] - prelink_tmpfile = os.path.join("/", PRIVATE_PATH, "prelink-checksum.tmp." + str(os.getpid())) + prelink_tmpfile = None mylock = None try: if calc_prelink and prelink_capable: - mylock = portage.locks.lockfile(prelink_tmpfile, wantnewlockfile=1) # Create non-prelinked temporary file to checksum. # Files rejected by prelink are summed in place. try: - retval = portage.process.spawn([PRELINK_BINARY, "--undo", "-o", - prelink_tmpfile, filename], fd_pipes={}) + tmpfile_fd, prelink_tmpfile = tempfile.mkstemp() + try: + retval = portage.process.spawn([PRELINK_BINARY, + "--verify", filename], fd_pipes={1:tmpfile_fd}) + finally: + os.close(tmpfile_fd) if retval == os.EX_OK: myfilename = prelink_tmpfile except portage.exception.CommandNotFound: @@ -222,7 +226,7 @@ def perform_checksum(filename, hashname="MD5", calc_prelink=0): if e.errno == errno.ENOENT: raise portage.exception.FileNotFound(myfilename) raise - if calc_prelink and prelink_capable: + if prelink_tmpfile: try: os.unlink(prelink_tmpfile) except OSError, e: -- 2.26.2