]> err.no Git - dpkg/commitdiff
dpkg: Do not allocate memory when lstat fails while upgrading
authorGuillem Jover <guillem@debian.org>
Tue, 1 Jul 2008 01:44:12 +0000 (04:44 +0300)
committerGuillem Jover <guillem@debian.org>
Tue, 1 Jul 2008 06:43:39 +0000 (09:43 +0300)
ChangeLog
debian/changelog
src/processarc.c

index 15f57b7839e83b4af3d2338278508a67aad38dc1..be02b230c29c96bd8adae3c511923556ce75b0b9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-07-01  Guillem Jover  <guillem@debian.org>
+
+       * src/processarc.c (process_archive): Do not allocate a struct stat
+       when lstat fails, instead assign a pointer to a static empty stat
+       variable that will mark it as such.
+
 2008-06-30  Guillem Jover  <guillem@debian.org>
 
        * lib/showpkg.c (parsefield): Remove unneeded 'const char *' cast.
index 04a46a9360733b00785d344a1e623e69953bd4dd..bfbd6a02f2ac604066f96f57868be2680e344a7b 100644 (file)
@@ -22,6 +22,7 @@ dpkg (1.15.0) UNRELEASED; urgency=low
   * Support diverting files when origin and destination are on different file
     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.
 
   [ Raphael Hertzog ]
   * Enhance dpkg-shlibdeps's error message when a library can't be found to
index 667ca7b494b87b1b4bb59c764e341d6a53880f58..75535d025afcb535e1ac5d45d6d0ea6c91d7dedb 100644 (file)
@@ -680,6 +680,8 @@ void process_archive(const char *filename) {
        * since ones that stayed the same don't really apply here.
        */
       struct fileinlist *sameas = NULL;
+      static struct stat empty_stat;
+
       /* If we can't stat the old or new file, or it's a directory,
        * we leave it up to the normal code
        */
@@ -688,17 +690,21 @@ void process_archive(const char *filename) {
 
       for (cfile= newfileslist; cfile; cfile= cfile->next) {
        if (!cfile->namenode->filestat) {
-         cfile->namenode->filestat= nfmalloc(sizeof(struct stat));
-         if (lstat(cfile->namenode->name, cfile->namenode->filestat)) {
+         struct stat tmp_stat;
+
+         if (lstat(cfile->namenode->name, &tmp_stat) == 0) {
+           cfile->namenode->filestat = nfmalloc(sizeof(struct stat));
+           memcpy(cfile->namenode->filestat, &tmp_stat, sizeof(struct stat));
+         } else {
            if (!(errno == ENOENT || errno == ELOOP || errno == ENOTDIR))
              ohshite(_("unable to stat other new file `%.250s'"),
                      cfile->namenode->name);
-           memset(cfile->namenode->filestat, 0,
-                  sizeof(*cfile->namenode->filestat));
+           cfile->namenode->filestat = &empty_stat;
            continue;
          }
        }
-       if (!cfile->namenode->filestat->st_mode) continue;
+       if (cfile->namenode->filestat == &empty_stat)
+         continue;
        if (oldfs.st_dev == cfile->namenode->filestat->st_dev &&
            oldfs.st_ino == cfile->namenode->filestat->st_ino) {
          if (sameas)