core/pacman to 4.1.0-2

This commit is contained in:
Kevin Mihelich 2013-04-08 00:03:59 +00:00
parent d8023ed1d8
commit 0f24fc5e00
6 changed files with 59 additions and 296 deletions

View file

@ -1,151 +0,0 @@
From 717fdb8ee0fd23cf72fc7d2832317f513caefa2c Mon Sep 17 00:00:00 2001
From: Allan McRae <allan@archlinux.org>
Date: Sun, 8 Jul 2012 21:36:36 +1000
Subject: [PATCH 1/4] Add conflict for replacing owned empty directory
When two packages own an empty directory, pacman finds no conflict when
one of those packages wants to replace the directory with a file or a
symlink. When it comes to actually extracting the new file/symlink,
pacman sees the directory is still there (we do not remove empty
directories if they are owned by a package) and refuses to extract.
Detect this potential conflict early and bail. Note that it is a
_potential_ conflict and not a guaranteed one as the other package owning
the directory could be updated or removed first which would remove
the conflict. However, pacman currently can not sort package installation
order to ensure this, so this conflict requires manual upgrade ordering.
Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
---
lib/libalpm/conflict.c | 32 ++++++++++++++++++++++++++------
test/pacman/tests/fileconflict009.py | 20 ++++++++++++++++++++
test/pacman/tests/fileconflict010.py | 20 ++++++++++++++++++++
3 files changed, 66 insertions(+), 6 deletions(-)
create mode 100644 test/pacman/tests/fileconflict009.py
create mode 100644 test/pacman/tests/fileconflict010.py
diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
index 32f6f30..efa1a87 100644
--- a/lib/libalpm/conflict.c
+++ b/lib/libalpm/conflict.c
@@ -328,15 +328,35 @@ const alpm_file_t *_alpm_filelist_contains(alpm_filelist_t *filelist,
return NULL;
}
-static int dir_belongsto_pkg(const char *root, const char *dirpath,
+static int dir_belongsto_pkg(alpm_handle_t *handle, const char *dirpath,
alpm_pkg_t *pkg)
{
+ alpm_list_t *i;
struct stat sbuf;
char path[PATH_MAX];
char abspath[PATH_MAX];
- struct dirent *ent = NULL;
DIR *dir;
+ struct dirent *ent = NULL;
+ const char *root = handle->root;
+
+ /* TODO: this is an overly strict check but currently pacman will not
+ * overwrite a directory with a file (case 10/11 in add.c). Adjusting that
+ * is not simple as even if the directory is being unowned by a conflicting
+ * package, pacman does not sort this to ensure all required directory
+ * "removals" happen before installation of file/symlink */
+
+ /* check that no other _installed_ package owns the directory */
+ for(i = _alpm_db_get_pkgcache(handle->db_local); i; i = i->next) {
+ if(pkg == i->data) {
+ continue;
+ }
+
+ if(_alpm_filelist_contains(alpm_pkg_get_files(i->data), dirpath)) {
+ return 0;
+ }
+ }
+ /* check all files in directory are owned by the package */
snprintf(abspath, PATH_MAX, "%s%s", root, dirpath);
dir = opendir(abspath);
if(dir == NULL) {
@@ -349,13 +369,13 @@ static int dir_belongsto_pkg(const char *root, const char *dirpath,
if(strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
continue;
}
- snprintf(path, PATH_MAX, "%s/%s", dirpath, name);
+ snprintf(path, PATH_MAX, "%s%s", dirpath, name);
snprintf(abspath, PATH_MAX, "%s%s", root, path);
if(stat(abspath, &sbuf) != 0) {
continue;
}
if(S_ISDIR(sbuf.st_mode)) {
- if(dir_belongsto_pkg(root, path, pkg)) {
+ if(dir_belongsto_pkg(handle, path, pkg)) {
continue;
} else {
closedir(dir);
@@ -529,9 +549,9 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
sprintf(dir, "%s/", filestr);
if(_alpm_filelist_contains(alpm_pkg_get_files(dbpkg), dir)) {
_alpm_log(handle, ALPM_LOG_DEBUG,
- "check if all files in %s belongs to %s\n",
+ "check if all files in %s belong to %s\n",
dir, dbpkg->name);
- resolved_conflict = dir_belongsto_pkg(handle->root, filestr, dbpkg);
+ resolved_conflict = dir_belongsto_pkg(handle, dir, dbpkg);
}
free(dir);
}
diff --git a/test/pacman/tests/fileconflict009.py b/test/pacman/tests/fileconflict009.py
new file mode 100644
index 0000000..904af4a
--- /dev/null
+++ b/test/pacman/tests/fileconflict009.py
@@ -0,0 +1,20 @@
+self.description = "dir->symlink change during package upgrade (directory conflict)"
+
+lp1 = pmpkg("pkg1")
+lp1.files = ["dir/"]
+self.addpkg2db("local", lp1)
+
+lp2 = pmpkg("pkg2")
+lp2.files = ["dir/"]
+self.addpkg2db("local", lp2)
+
+p = pmpkg("pkg1", "1.0-2")
+p.files = ["dir -> /usr/dir"]
+self.addpkg2db("sync", p)
+
+self.args = "-S pkg1"
+
+self.addrule("PACMAN_RETCODE=1")
+self.addrule("PKG_VERSION=pkg1|1.0-1")
+self.addrule("PKG_VERSION=pkg2|1.0-1")
+self.addrule("DIR_EXIST=dir/")
diff --git a/test/pacman/tests/fileconflict010.py b/test/pacman/tests/fileconflict010.py
new file mode 100644
index 0000000..0a3ce83
--- /dev/null
+++ b/test/pacman/tests/fileconflict010.py
@@ -0,0 +1,20 @@
+self.description = "dir->file change during package upgrade (directory conflict)"
+
+lp1 = pmpkg("pkg1")
+lp1.files = ["dir/"]
+self.addpkg2db("local", lp1)
+
+lp2 = pmpkg("pkg2")
+lp2.files = ["dir/"]
+self.addpkg2db("local", lp2)
+
+p = pmpkg("pkg1", "1.0-2")
+p.files = ["dir"]
+self.addpkg2db("sync", p)
+
+self.args = "-S pkg1"
+
+self.addrule("PACMAN_RETCODE=1")
+self.addrule("PKG_VERSION=pkg1|1.0-1")
+self.addrule("PKG_VERSION=pkg2|1.0-1")
+self.addrule("DIR_EXIST=dir/")
--
1.7.11.1

View file

@ -1,60 +0,0 @@
From 44e9fdd0e848382337edb97d41e7317638a67bac Mon Sep 17 00:00:00 2001
From: Allan McRae <allan@archlinux.org>
Date: Sun, 8 Jul 2012 23:58:37 +1000
Subject: [PATCH 2/4] Check empty subdirectory ownership
When checking if a package owns a directory, it is important to check
not only that all the files in the directory are part of the package,
but also if the directory is part of a package. This catches empty
subdirectories during conflict checking for directory to file/symlink
replacements.
Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
---
lib/libalpm/conflict.c | 5 +++++
test/pacman/tests/fileconflict012.py | 17 +++++++++++++++++
2 files changed, 22 insertions(+)
create mode 100644 test/pacman/tests/fileconflict012.py
diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
index efa1a87..d6e5d8c 100644
--- a/lib/libalpm/conflict.c
+++ b/lib/libalpm/conflict.c
@@ -339,6 +339,11 @@ static int dir_belongsto_pkg(alpm_handle_t *handle, const char *dirpath,
struct dirent *ent = NULL;
const char *root = handle->root;
+ /* check directory is actually in package - used for subdirectory checks */
+ if(!_alpm_filelist_contains(alpm_pkg_get_files(pkg), dirpath)) {
+ return 0;
+ }
+
/* TODO: this is an overly strict check but currently pacman will not
* overwrite a directory with a file (case 10/11 in add.c). Adjusting that
* is not simple as even if the directory is being unowned by a conflicting
diff --git a/test/pacman/tests/fileconflict012.py b/test/pacman/tests/fileconflict012.py
new file mode 100644
index 0000000..421b739
--- /dev/null
+++ b/test/pacman/tests/fileconflict012.py
@@ -0,0 +1,17 @@
+self.description = "dir->file change during package upgrade (filesystem file conflict)"
+
+lp1 = pmpkg("pkg1")
+lp1.files = ["dir/"]
+self.addpkg2db("local", lp1)
+
+self.filesystem = ["dir/file"]
+
+p = pmpkg("pkg1", "1.0-2")
+p.files = ["dir"]
+self.addpkg2db("sync", p)
+
+self.args = "-S pkg1"
+
+self.addrule("PACMAN_RETCODE=1")
+self.addrule("PKG_VERSION=pkg1|1.0-1")
+self.addrule("DIR_EXIST=dir/")
--
1.7.11.1

View file

@ -1,29 +0,0 @@
From 1bf05e706b5edac92e9c913a69ca8686c6440f8b Mon Sep 17 00:00:00 2001
From: Dan McGee <dan@archlinux.org>
Date: Fri, 04 May 2012 16:41:40 +0000
Subject: Ensure pre_upgrade scriptlet gets old package version
This was accidentally broken in the refactor done in commit 73139ccb.
Fixes FS#29371.
Signed-off-by: Dan McGee <dan@archlinux.org>
---
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index 6c2f0cb..c49d99b 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -488,8 +488,9 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
if(alpm_pkg_has_scriptlet(newpkg) &&
!(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
const char *scriptlet_name = is_upgrade ? "pre_upgrade" : "pre_install";
- _alpm_runscriptlet(handle, pkgfile,
- scriptlet_name, newpkg->version, NULL, 1);
+
+ _alpm_runscriptlet(handle, pkgfile, scriptlet_name,
+ newpkg->version, oldpkg ? oldpkg->version : NULL, 1);
}
/* we override any pre-set reason if we have alldeps or allexplicit set */
--
cgit v0.9.0.2-13-g2bd3

View file

@ -9,33 +9,30 @@
# - makepkg.conf: adjusted C/CXX/LDFLAGS
pkgname=pacman
pkgver=4.0.3
pkgrel=7
pkgver=4.1.0
pkgrel=2
pkgdesc="A library-based package manager with dependency support"
arch=('i686' 'x86_64')
url="http://www.archlinux.org/pacman/"
license=('GPL')
groups=('base' 'base-devel')
depends=('bash' 'glibc>=2.16.0' 'libarchive>=3.1.2' 'curl>=7.19.4'
depends=('bash>=4.2.042-2' 'glibc>=2.17-2' 'libarchive>=3.1.2' 'curl>=7.19.4'
'gpgme' 'pacman-mirrorlist')
makedepends=('asciidoc')
checkdepends=('python2' 'fakechroot')
optdepends=('fakeroot: for makepkg usage as normal user')
provides=('pacman-contrib')
conflicts=('pacman-contrib')
replaces=('pacman-contrib')
backup=(etc/pacman.conf etc/makepkg.conf)
install=pacman.install
options=(!libtool)
source=(ftp://ftp.archlinux.org/other/pacman/$pkgname-$pkgver.tar.gz{,.sig}
0001-Add-conflict-for-replacing-owned-empty-directory.patch
0002-Check-empty-subdirectory-ownership.patch
0003-Ensure-pre_upgrade-scriptlet-gets-old-package-version.patch
pacman.conf
makepkg.conf)
md5sums=('387965c7125e60e5f0b9ff3b427fe0f9'
'1a70392526c8768470da678b31905a6e'
'0c1d326d0ca48c9a9819ea8060ea3bba'
'02db451be806335ce189ffadb5cf84b9'
'2e8cbf55a94b1954b167c5dee6b62317'
'9a7d914def620cc4dd1a94ed53892175'
'e6d44e71b847d2c98bb38087e33cd76b')
md5sums=('a0f2b3148bee4784f21cf373cf59a0bc'
'4959b8d00056398195f4e549e7bdd346'
'5c491b27bae54d93d6ba972ce0fccfa7'
'105c1e891b91cc715bb80b532514f8b1')
# keep an upgrade path for older installations
PKGEXT='.pkg.tar.gz'
@ -48,8 +45,11 @@ build() {
patch -p1 -i $srcdir/0003-Ensure-pre_upgrade-scriptlet-gets-old-package-version.patch
./configure --prefix=/usr --sysconfdir=/etc \
--localstatedir=/var --enable-doc
--localstatedir=/var --enable-doc \
--with-scriptlet-shell=/usr/bin/bash \
--with-ldconfig=/usr/bin/ldconfig
make
make -C contrib
}
check() {
@ -59,36 +59,23 @@ check() {
package() {
cd $srcdir/$pkgname-$pkgver
make DESTDIR=$pkgdir install
make DESTDIR=$pkgdir -C contrib install
# install Arch specific stuff
mkdir -p $pkgdir/etc
install -dm755 $pkgdir/etc
install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf
case "$CARCH" in
i686)
install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf
mycarch="i686"
mychost="i686-pc-linux-gnu"
myflags="-march=i686 "
;;
x86_64)
install -m644 $srcdir/pacman.conf.x86_64 $pkgdir/etc/pacman.conf
mycarch="x86_64"
mychost="x86_64-unknown-linux-gnu"
myflags="-march=x86-64 "
;;
arm)
install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf
mycarch="arm"
mychost="armv5tel-unknown-linux-gnueabi"
myflags="-march=armv5te "
;;
armv6h)
install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf
mycarch="armv6h"
mychost="armv6l-unknown-linux-gnueabihf"
myflags="-march=armv6 -mfloat-abi=hard -mfpu=vfp "
;;
armv7h)
install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf
mycarch="armv7h"
mychost="armv7l-unknown-linux-gnueabihf"
myflags="-march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 "
@ -102,11 +89,13 @@ package() {
-e "s|@CARCHFLAGS[@]|$myflags|g"
sed -i $pkgdir/etc/pacman.conf -e "s|@CARCH[@]|$mycarch|g"
# install completion files
install -Dm644 contrib/bash_completion "$pkgdir/usr/share/bash-completion/completions/pacman"
# put bash_completion in the right location
install -dm755 ${pkgdir}/usr/share/bash-completion/completions
mv ${pkgdir}/etc/bash_completion.d/pacman \
${pkgdir}/usr/share/bash-completion/completions
rmdir ${pkgdir}/etc/bash_completion.d
for f in makepkg pacman-key; do
ln -s pacman "$pkgdir/usr/share/bash-completion/completions/$f"
done
install -Dm644 contrib/zsh_completion $pkgdir/usr/share/zsh/site-functions/_pacman
}

View file

@ -11,7 +11,7 @@
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync -z %u %o'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
# Other common tools:
@ -29,11 +29,15 @@ CHOST="@CHOST@"
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
CXXFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
LDFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
#-- Debugging flags
DEBUG_CFLAGS="-g -fvar-tracking-assignments"
DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
#########################################################################
# BUILD ENVIRONMENT
@ -63,18 +67,20 @@ BUILDENV=(fakeroot !distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
# Default: OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !upx !debug)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
#-- docs: Save doc directories specified by DOC_DIRS
#-- libtool: Leave libtool (.la) files in packages
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#-- strip: Strip symbols from binaries/libraries
#-- docs: Save doc directories specified by DOC_DIRS
#-- libtool: Leave libtool (.la) files in packages
#-- staticlibs: Leave static library (.a) files in packages
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#-- debug: Add debugging flags as specified in DEBUG_* variables
#
OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !upx !debug)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
@ -108,6 +114,18 @@ PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Specify a key to use for package signing
#GPGKEY=""
#########################################################################
# COMPRESSION DEFAULTS
#########################################################################
#
COMPRESSGZ=(gzip -c -f -n)
COMPRESSBZ2=(bzip2 -c -f)
COMPRESSXZ=(xz -c -z -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)
#########################################################################
# EXTENSION DEFAULTS
#########################################################################

View file

@ -15,11 +15,10 @@
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
#SyncFirst = pacman
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = @CARCH@
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@ -31,7 +30,7 @@ Architecture = @CARCH@
# Misc options
#UseSyslog
#UseDelta
#Color
#TotalDownload
CheckSpace
#VerbosePkgLists
@ -41,7 +40,9 @@ CheckSpace
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
#SigLevel = Required DatabaseOptional
#LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
@ -73,23 +74,18 @@ SigLevel = Never
# after the header, and they will be used before the default mirrors.
[core]
#SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[extra]
#SigLevel = PackageOptional
Include = /etc/pacman.d/mirrorlist
[community]
#SigLevel = PackageOptional
Include = /etc/pacman.d/mirrorlist
[alarm]
#SigLevel = PackageOptional
Include = /etc/pacman.d/mirrorlist
[aur]
#SigLevel = PackageOptional
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for