]> err.no Git - dpkg/commitdiff
dpkg: Properly lstat the correct file when using --root on upgrades
authorEgmont Koblinger <egmont@uhulinux.hu>
Tue, 1 Jul 2008 06:22:14 +0000 (09:22 +0300)
committerGuillem Jover <guillem@debian.org>
Tue, 1 Jul 2008 06:53:48 +0000 (09:53 +0300)
Closes: #281057
ChangeLog
debian/changelog
src/processarc.c

index be02b230c29c96bd8adae3c511923556ce75b0b9..99f2f21767248b422115cf69918d50378b0355d9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-07-01  Egmont Koblinger  <egmont@uhulinux.hu>
+
+       * src/processarc.c (process_archive): Properly lstat the correct
+       file on upgrade when using --root.
+
 2008-07-01  Guillem Jover  <guillem@debian.org>
 
        * src/processarc.c (process_archive): Do not allocate a struct stat
index bfbd6a02f2ac604066f96f57868be2680e344a7b..d648b38ec9f13f93f891d381c973d1ef88ad769e 100644 (file)
@@ -23,6 +23,8 @@ dpkg (1.15.0) UNRELEASED; urgency=low
     systems. Based on a patch by Juergen Kreileder. Closes: #102144, #149961
   * Do not silently enable --rename on dpkg-divert --remove. Closes: #160848
   * Do not allocate memory when lstat fails during package upgrade.
+  * Properly lstat the correct file when using --root on package upgrade.
+    Thanks to Egmont Koblinger. Closes: #281057
 
   [ Raphael Hertzog ]
   * Enhance dpkg-shlibdeps's error message when a library can't be found to
index 75535d025afcb535e1ac5d45d6d0ea6c91d7dedb..a3b455d4e18b1dfcd481faab7026fa2c8ac99988 100644 (file)
@@ -681,6 +681,7 @@ void process_archive(const char *filename) {
        */
       struct fileinlist *sameas = NULL;
       static struct stat empty_stat;
+      struct varbuf cfilename = VARBUF_INIT;
 
       /* If we can't stat the old or new file, or it's a directory,
        * we leave it up to the normal code
@@ -692,7 +693,13 @@ void process_archive(const char *filename) {
        if (!cfile->namenode->filestat) {
          struct stat tmp_stat;
 
-         if (lstat(cfile->namenode->name, &tmp_stat) == 0) {
+         varbufreset(&cfilename);
+         varbufaddstr(&cfilename, instdir);
+         varbufaddc(&cfilename, '/');
+         varbufaddstr(&cfilename, cfile->namenode->name);
+         varbufaddc(&cfilename, '\0');
+
+         if (lstat(cfilename.buf, &tmp_stat) == 0) {
            cfile->namenode->filestat = nfmalloc(sizeof(struct stat));
            memcpy(cfile->namenode->filestat, &tmp_stat, sizeof(struct stat));
          } else {
@@ -718,6 +725,8 @@ void process_archive(const char *filename) {
        }
       }
 
+      varbuffree(&cfilename);
+
       if ((namenode->flags & fnnf_old_conff)) {
        if (sameas) {
          if (sameas->namenode->flags & fnnf_new_conff) {