[Yum-devel] [PATCH] Work around umask/permission problems, for yumdb and rpmdb-index data.

James Antill james at and.org
Wed Apr 13 21:28:21 UTC 2011


---
 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
+
+    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
-- 
1.7.3.4



More information about the Yum-devel mailing list