Changelogs and install files were getting extracted into the local
db folder before it was manually created.  This created issues for
uses with 0077 umasks and was highlighted with the new sudo handling
of umasks (FS#12263).

This moves the local db creation to its own function which is called
before the start of package archive extraction.  Also, added a check
that the folder is actually created.

Signed-off-by: Allan McRae <[email protected]>
---
 lib/libalpm/add.c      |   10 ++++++++++
 lib/libalpm/be_files.c |   24 +++++++++++++++++++++---
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index eef7aab..c200c3c 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -696,6 +696,16 @@ static int commit_single_pkg(pmpkg_t *newpkg, int 
pkg_current, int pkg_count,
                }
        }
 
+       /* prepare directory for database entries so permission are correct 
after
+          changelog/install script installation (FS#12263) */
+       if(_alpm_db_mkdir(db, newpkg)) {
+               alpm_logaction("error: could not create database directory 
%s-%s\n",
+                               alpm_pkg_get_name(newpkg), 
alpm_pkg_get_version(newpkg));
+               pm_errno = PM_ERR_DB_WRITE;
+               ret = -1;
+               goto cleanup;
+       }
+
        if(!(trans->flags & PM_TRANS_FLAG_DBONLY)) {
                struct archive *archive;
                struct archive_entry *entry;
diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c
index b9ff646..7d04ade 100644
--- a/lib/libalpm/be_files.c
+++ b/lib/libalpm/be_files.c
@@ -652,6 +652,26 @@ error:
        return(-1);
 }
 
+int _alpm_db_mkdir(pmdb_t *db, pmpkg_t *info)
+{
+       mode_t oldmask;
+       int retval = 0;
+       char *pkgpath = NULL;
+
+       oldmask = umask(0000);
+
+       pkgpath = get_pkgpath(db, info);
+
+       if((retval = mkdir(pkgpath, 0755)) != 0) {
+               _alpm_log(PM_LOG_ERROR, _("could not create directory %s: 
%s\n"), pkgpath, strerror(errno));
+       }
+
+       free(pkgpath);
+       umask(oldmask);
+
+       return(retval);
+}
+
 int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 {
        FILE *fp = NULL;
@@ -670,10 +690,8 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t 
inforeq)
 
        pkgpath = get_pkgpath(db, info);
 
-       oldmask = umask(0000);
-       mkdir(pkgpath, 0755);
        /* make sure we have a sane umask */
-       umask(0022);
+       oldmask = umask(0022);
 
        if(strcmp(db->treename, "local") == 0) {
                local = 1;
-- 
1.6.1

_______________________________________________
pacman-dev mailing list
[email protected]
http://archlinux.org/mailman/listinfo/pacman-dev

Reply via email to