[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