summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libalpm/add.c10
-rw-r--r--lib/libalpm/be_files.c24
-rw-r--r--lib/libalpm/db.h1
3 files changed, 32 insertions, 3 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index eef7aab1..1e8ec9f2 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_prepare(db, newpkg)) {
+ alpm_logaction("error: could not create database entry %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 b9ff6464..31b23172 100644
--- a/lib/libalpm/be_files.c
+++ b/lib/libalpm/be_files.c
@@ -652,6 +652,26 @@ error:
return(-1);
}
+int _alpm_db_prepare(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;
diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h
index 96fac0dd..25b90b5f 100644
--- a/lib/libalpm/db.h
+++ b/lib/libalpm/db.h
@@ -60,6 +60,7 @@ int _alpm_db_open(pmdb_t *db);
void _alpm_db_close(pmdb_t *db);
int _alpm_db_populate(pmdb_t *db);
int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq);
+int _alpm_db_prepare(pmdb_t *db, pmpkg_t *info);
int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq);
int _alpm_db_remove(pmdb_t *db, pmpkg_t *info);