diff options
author | Nagy Gabor <ngaba@bibl.u-szeged.hu> | 2009-01-18 20:03:56 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2009-01-18 13:35:17 -0600 |
commit | 472e51b975b9cb8fe1f67c03ff72bbc067fa7f01 (patch) | |
tree | 289342e7706c4edddc6d076602e90bc25027cab6 /lib | |
parent | 1191303f8b9edc01ff969e2433f5c40c9a95474a (diff) | |
download | pacman-472e51b975b9cb8fe1f67c03ff72bbc067fa7f01.tar.xz |
Use archive_entry_set_perm instead of archive_entry_set_mode
This patch fixes FS#12148 ('unstable' regular file).
I also changed the other archive_entry_set_mode usage in add.c to
archive_entry_set_perm.
Since I cannot find any relevant info in libarchive manual, I quote
Tim Kientzle (the author of libarchive) here, and I say thank you for
his help.
*** Tim Kientzle wrote *************************************
This is the problem in libalpm/util.c:
323 if(S_ISREG(st->st_mode)) {
324 archive_entry_set_mode(entry, 0644);
325 } else if(S_ISDIR(st->st_mode)) {
326 archive_entry_set_mode(entry, 0755);
327 }
Your example unstable.db.tar.gz is not empty. It has
one entry in it, called "./". That entry is marked
as a directory. But, when you call archive_entry_set_mode(),
you are changing the file type! archive_read_extract()
then creates the file /var/unstable as you requested.
(archive_read_extract() will replace an empty directory
with a file.)
You should either set the mode value correctly:
323 if(S_ISREG(st->st_mode)) {
324 archive_entry_set_mode(entry, IFREG | 0644);
325 } else if(S_ISDIR(st->st_mode)) {
326 archive_entry_set_mode(entry, IFDIR | 0755);
327 }
Or use archive_entry_set_perm(), which does not change
the file type:
323 if(S_ISREG(st->st_mode)) {
324 archive_entry_set_perm(entry, 0644);
325 } else if(S_ISDIR(st->st_mode)) {
326 archive_entry_set_perm(entry, 0755);
327 }
************************************************************
Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu>
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libalpm/add.c | 4 | ||||
-rw-r--r-- | lib/libalpm/util.c | 4 |
2 files changed, 4 insertions, 4 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index 1e8ec9f2..838f5a6d 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -292,12 +292,12 @@ static int extract_single_file(struct archive *archive, /* the install script goes inside the db */ snprintf(filename, PATH_MAX, "%s%s-%s/install", db->path, newpkg->name, newpkg->version); - archive_entry_set_mode(entry, 0644); + archive_entry_set_perm(entry, 0644); } else if(strcmp(entryname, ".CHANGELOG") == 0) { /* the changelog goes inside the db */ snprintf(filename, PATH_MAX, "%s%s-%s/changelog", db->path, newpkg->name, newpkg->version); - archive_entry_set_mode(entry, 0644); + archive_entry_set_perm(entry, 0644); } else if(*entryname == '.') { /* for now, ignore all files starting with '.' that haven't * already been handled (for future possibilities) */ diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index da3463b0..be465afa 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -310,9 +310,9 @@ int _alpm_unpack(const char *archive, const char *prefix, const char *fn) entryname = archive_entry_pathname(entry); if(S_ISREG(st->st_mode)) { - archive_entry_set_mode(entry, 0644); + archive_entry_set_perm(entry, 0644); } else if(S_ISDIR(st->st_mode)) { - archive_entry_set_mode(entry, 0755); + archive_entry_set_perm(entry, 0755); } /* If a specific file was requested skip entries that don't match. */ |