[Yum-devel] [PATCH] Work around umask/permission problems, for yumdb and rpmdb-index data.
Mike Bonnet
mikeb at redhat.com
Wed Apr 13 22:52:46 UTC 2011
On 04/13/2011 05:28 PM, James Antill wrote:
> ---
> yum/rpmsack.py | 60 +++++++++++++++++++++++++++++++++++++++++--------------
> 1 files changed, 44 insertions(+), 16 deletions(-)
>
> diff --git a/yum/rpmsack.py b/yum/rpmsack.py
> index e93df20..44678b2 100644
> --- a/yum/rpmsack.py
> +++ b/yum/rpmsack.py
> @@ -37,6 +37,28 @@ import constants
>
> import yum.depsolve
>
> +def _open_no_umask(*args):
> + """ Annoying people like to set umask's for root, which screws everything
> + up for user readable stuff. """
> + oumask = os.umask(0777)
> + try:
> + ret = open(*args)
> + except Exception, e:
> + os.umask(oumask)
> + raise e
Why not try: finally: ?
> +
> + os.umask(oumask)
> + return ret
> +
> +def _iopen(*args):
> + """ IOError wrapper BS for open, stupid exceptions. """
> + try:
> + ret = open(*args)
> + except IOError, e:
> + return None, e
> + return ret, None
> +
> +
> class RPMInstalledPackage(YumInstalledPackage):
>
> def __init__(self, rpmhdr, index, rpmdb):
> @@ -635,7 +657,7 @@ class RPMDBPackageSack(PackageSackBase):
> return
>
> conflicts_fname = self._cachedir + '/conflicts'
> - fo = open(conflicts_fname + '.tmp', 'w')
> + fo = _open_no_umask(conflicts_fname + '.tmp', 'w')
> fo.write("%s\n" % rpmdbv)
> fo.write("%u\n" % len(pkgs))
> for pkg in sorted(pkgs):
> @@ -677,10 +699,9 @@ class RPMDBPackageSack(PackageSackBase):
> return fo.readline()[:-1]
>
> conflict_fname = self._cachedir + '/conflicts'
> - if not os.path.exists(conflict_fname):
> + fo, e = _iopen(conflict_fname)
> + if fo is None:
> return None
> -
> - fo = open(conflict_fname)
> frpmdbv = fo.readline()
> rpmdbv = self.simpleVersion(main_only=True)[0]
> if not frpmdbv or rpmdbv != frpmdbv[:-1]:
> @@ -766,11 +787,12 @@ class RPMDBPackageSack(PackageSackBase):
> return fo.readline()[:-1]
>
> assert self.__cache_rpmdb__
> - if not os.path.exists(self._cachedir + '/file-requires'):
> +
> + fo, e = _iopen(self._cachedir + '/file-requires')
> + if fo is None:
> return None, None
>
> rpmdbv = self.simpleVersion(main_only=True)[0]
> - fo = open(self._cachedir + '/file-requires')
> frpmdbv = fo.readline()
> if not frpmdbv or rpmdbv != frpmdbv[:-1]:
> return None, None
> @@ -889,7 +911,7 @@ class RPMDBPackageSack(PackageSackBase):
> if installedUnresolvedFileRequires:
> return
>
> - fo = open(self._cachedir + '/file-requires.tmp', 'w')
> + fo = _open_no_umask(self._cachedir + '/file-requires.tmp', 'w')
> fo.write("%s\n" % rpmdbversion)
>
> fo.write("%u\n" % len(installedFileRequires))
> @@ -923,14 +945,14 @@ class RPMDBPackageSack(PackageSackBase):
> if not self.__cache_rpmdb__:
> return
>
> - if not os.path.exists(self._cachedir + '/pkgtups-checksums'):
> - return
> -
> def _read_str(fo):
> return fo.readline()[:-1]
>
> + fo, e = _iopen(self._cachedir + '/pkgtups-checksums')
> + if fo is None:
> + return
> +
> rpmdbv = self.simpleVersion(main_only=True)[0]
> - fo = open(self._cachedir + '/pkgtups-checksums')
> frpmdbv = fo.readline()
> if not frpmdbv or rpmdbv != frpmdbv[:-1]:
> return
> @@ -991,7 +1013,7 @@ class RPMDBPackageSack(PackageSackBase):
> return
>
> pkg_checksum_tups = data
> - fo = open(self._cachedir + '/pkgtups-checksums.tmp', 'w')
> + fo = _open_no_umask(self._cachedir + '/pkgtups-checksums.tmp', 'w')
> fo.write("%s\n" % rpmdbversion)
> fo.write("%u\n" % len(pkg_checksum_tups))
> for pkgtup, TD in sorted(pkg_checksum_tups):
> @@ -1024,7 +1046,10 @@ class RPMDBPackageSack(PackageSackBase):
> nmtime = os.path.getmtime(rpmdbvfname)
> omtime = os.path.getmtime(rpmdbfname)
> if omtime <= nmtime:
> - rpmdbv = open(rpmdbvfname).readline()[:-1]
> + fo, e = _iopen(rpmdbvfname)
> + if fo is None:
> + return None
> + rpmdbv = fo.readline()[:-1]
> self._have_cached_rpmdbv_data = rpmdbv
> return self._have_cached_rpmdbv_data
>
> @@ -1057,7 +1082,7 @@ class RPMDBPackageSack(PackageSackBase):
> except (IOError, OSError), e:
> return
>
> - fo = open(rpmdbvfname + ".tmp", "w")
> + fo = _open_no_umask(rpmdbvfname + ".tmp", "w")
> fo.write(self._have_cached_rpmdbv_data)
> fo.write('\n')
> fo.close()
> @@ -1694,7 +1719,8 @@ class RPMDBAdditionalDataPackage(object):
>
> # Default write()+rename()... hardlink -c can still help.
> misc.unlink_f(fn + '.tmp')
> - fo = open(fn + '.tmp', 'w')
> +
> + fo = _open_no_umask(fn + '.tmp', 'w')
> try:
> fo.write(value)
> except (OSError, IOError), e:
> @@ -1727,7 +1753,9 @@ class RPMDBAdditionalDataPackage(object):
> self._auto_cache(attr, self._yumdb_cache[key], fn, info)
> return self._read_cached_data[attr]
>
> - fo = open(fn, 'r')
> + fo, e = _iopen(fn)
> + if fo is None: # This really sucks, don't do that.
> + return '<E:%d>' % e.errno
> value = fo.read()
> fo.close()
> del fo
More information about the Yum-devel
mailing list