Package: dpkg
Version: 1.15.7.2
Severity: important
File: /usr/bin/dpkg-divert
Tags: patch
Hi,
dpkg-divert --add --rename incorrectly renames an existing file that is
owned by the package given with --package. For example see the following
commands:
# dpkg -S /usr/bin/users
coreutils: /usr/bin/users
# ls -la /usr/bin/users*
-rwxr-xr-x 1 root root 28368 Apr 28 04:05 /usr/bin/users
# dpkg-divert --add --rename --package coreutils --divert
/usr/bin/users.diverted /usr/bin/users
Adding `diversion of /usr/bin/users to /usr/bin/users.diverted by coreutils'
# ls -la /usr/bin/users*
-rwxr-xr-x 1 root root 28368 Apr 28 04:05 /usr/bin/users.diverted
Oops, that should not have happened!
A patch that adds a check for the owning package of the to be renamed
file is attached.
Andreas
-- System Information:
Debian Release: squeeze/sid
APT prefers testing
APT policy: (800, 'testing'), (800, 'stable'), (600, 'unstable'), (130,
'experimental')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.31-0-amd64 (SMP w/4 CPU cores)
Locale: LANG=C, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages dpkg depends on:
ii coreutils 8.5-1 GNU core utilities
ii libbz2-1.0 1.0.5-4 high-quality block-sorting file co
ii libc6 2.11.1-3 Embedded GNU C Library: Shared lib
ii libselinux1 2.0.94-1 SELinux runtime shared libraries
ii xz-utils 4.999.9beta+20100527-1 XZ-format compression utilities
ii zlib1g 1:1.2.3.4.dfsg-3 compression library - runtime
dpkg recommends no packages.
Versions of packages dpkg suggests:
ii apt 0.7.25.3 Advanced front-end for dpkg
-- no debconf information
--- dpkg-divert 2010-05-30 13:21:36.000000000 +0200
+++ dpkg-divert.mine 2010-07-04 18:41:01.088037663 +0200
@@ -182,6 +182,7 @@
push(@package,$package);
printf(_g("Adding \`%s'")."\n", infon($#contest)) if $verbose > 0;
checkrename($file, $divertto);
+ checkowner($file, $package);
save();
dorename($file, $divertto);
exit(0);
@@ -303,6 +304,24 @@
}
}
+sub checkowner {
+ return unless $dorename;
+ my ($file,$package) = @_;
+ # the $file has alredy been checked to a) exist and b) not being diverted
+ # now check if it is owned by $package and prevent renaming in that case
+ if (open (DPKG, "dpkg -S $file |")) {
+ my $owner = <DPKG>;
+ if ($owner =~ /^([^:]+):/) {
+ if ($1 eq $package) {
+ $dorename = ! $dorename;
+ }
+ }
+ close DPKG;
+ } else {
+ # error handling ?
+ }
+}
+
sub rename_mv($$)
{
return (rename($_[0], $_[1]) || (system(("mv", $_[0], $_[1])) == 0));