[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#781858: apt: dangling pointer crash



This should do the trick.

Tomasz
From 9b568120c6e5a0e6361271de0440b4974a0bb7df Mon Sep 17 00:00:00 2001
From: Tomasz Buchert <tomasz@debian.org>
Date: Mon, 6 Apr 2015 14:38:45 +0200
Subject: [PATCH] Fix Mode use

---
 apt-pkg/acquire-item.cc | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index 253cbda..c5ad097 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -50,6 +50,14 @@
 
 using namespace std;
 
+static const char *xstrdup(const char *s)
+{
+   char* c = strdup(s);
+   if (!c)
+      abort();
+   return c;
+}
+
 // Acquire::Item::Item - Constructor					/*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -66,6 +74,8 @@ pkgAcquire::Item::Item(pkgAcquire *Owner) : Owner(Owner), FileSize(0),
 /* */
 pkgAcquire::Item::~Item()
 {
+   if (Mode != NULL)
+      free((void*)Mode);
    Owner->Remove(this);
 }
 									/*}}}*/
@@ -756,7 +766,7 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Has
       Local = true;
       Desc.URI = "rred:" + FinalFile;
       QueueURI(Desc);
-      Mode = "rred";
+      Mode = xstrdup("rred");
       return;
    } 
 
@@ -874,7 +884,7 @@ void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string M
       Local = true;
       Desc.URI = "rred:" + FinalFile;
       QueueURI(Desc);
-      Mode = "rred";
+      Mode = xstrdup("rred");
       return;
    }
    // success in download/apply all diffs, clean up
@@ -1128,7 +1138,7 @@ void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash,
       DestFile += ".decomp";
       Desc.URI = "copy:" + FileName;
       QueueURI(Desc);
-      Mode = "copy";
+      Mode = xstrdup("copy");
       return;
    }
 
@@ -1194,8 +1204,7 @@ void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash,
    Desc.URI = decompProg + ":" + FileName;
    QueueURI(Desc);
 
-   // FIXME: this points to a c++ string that goes out of scope
-   Mode = decompProg.c_str();
+   Mode = xstrdup(decompProg.c_str());
 }
 									/*}}}*/
 // AcqIndexTrans::pkgAcqIndexTrans - Constructor			/*{{{*/
@@ -1470,7 +1479,7 @@ void pkgAcqMetaIndex::Done(string Message,unsigned long long Size,string Hash,	/
          AuthPass = true;
          Desc.URI = "gpgv:" + SigFile;
          QueueURI(Desc);
-         Mode = "gpgv";
+         Mode = xstrdup("gpgv");
 	 return;
       }
    }
-- 
2.1.4

Attachment: signature.asc
Description: Digital signature


Reply to: