[Aptitude-svn-commit] r3693 - in branches/aptitude-0.3/aptitude: . src/generic src/generic/tests

Daniel Burrows dburrows at costa.debian.org
Tue Jul 26 04:50:41 UTC 2005


Author: dburrows
Date: Tue Jul 26 04:50:38 2005
New Revision: 3693

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/tags.cc
   branches/aptitude-0.3/aptitude/src/generic/tags.h
   branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc
Log:
Copy lots of data to avoid bad things happening due to deleted stuff being accessed.  Ew.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Tue Jul 26 04:50:38 2005
@@ -1,5 +1,11 @@
 2005-07-25  Daniel Burrows  <dburrows at debian.org>
 
+	* src/generic/tags.cc, src/generic/tags.h, src/generic/tests/test_tags.cc:
+
+	  Keep a local copy of the data for each tag and tag list.
+	  Without this, all sorts of hell breaks loose due to stuff being
+	  deleted at bad times (doh).
+
 	* src/generic/tags.cc:
 
 	  Fix the tag list parser so it doesn't routinely skip the first

Modified: branches/aptitude-0.3/aptitude/src/generic/tags.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/tags.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/tags.cc	Tue Jul 26 04:50:38 2005
@@ -23,6 +23,7 @@
 
 #include "apt.h"
 
+#include <algorithm>
 #include <utility>
 
 #include <ctype.h>
@@ -35,14 +36,16 @@
 
 using namespace std;
 
-tag::tag(const char *_start, const char *_finish)
-  :start(_start), finish(_finish)
+tag::tag(std::string::const_iterator start,
+	 std::string::const_iterator finish)
 {
   while(start != finish && isspace(*start))
     ++start;
 
   while(start != finish && isspace(*(finish-1)))
     --finish;
+
+  s.assign(start, finish);
 }
 
 // NB: this does the wrong thing if spaces occur within a tag (they
@@ -67,7 +70,7 @@
 
 tag::const_iterator tag::begin() const
 {
-  tag::const_iterator rval(start, start, finish);
+  tag::const_iterator rval(s.begin(), s.begin(), s.end());
 
   ++rval;
 
@@ -80,18 +83,12 @@
 
   while(myT != end() && otherT != other.end())
     {
-      // avoid operator* and its concomitant copies
-      size_t myN=myT.finish-myT.start;
-      size_t otherN=otherT.finish-otherT.start;
-
-      int res = strncmp(myT.start, otherT.start, min(myN, otherN));
-
-      // If there was a difference, break out.
-      if(res != 0)
-	return res;
-      else if(myN<otherN)
+      // ew, rather slow
+      if(lexicographical_compare(myT.start, myT.finish,
+				 otherT.start, otherT.finish))
 	return -1;
-      else if(myN>otherN)
+      else if(lexicographical_compare(otherT.start, otherT.finish,
+				      myT.start, myT.finish))
 	return 1;
 
       ++myT;
@@ -131,11 +128,11 @@
 
 tag_list::const_iterator tag_list::begin() const
 {
-  const char *endfirst=start;
-  while(endfirst != finish && (*endfirst) != ',')
+  std::string::const_iterator endfirst=s.begin();
+  while(endfirst != s.end() && (*endfirst) != ',')
     ++endfirst;
 
-  const_iterator rval(start, endfirst, finish);
+  const_iterator rval(s.begin(), endfirst, s.end());
   return rval;
 }
 

Modified: branches/aptitude-0.3/aptitude/src/generic/tags.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/tags.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/tags.h	Tue Jul 26 04:50:38 2005
@@ -31,18 +31,19 @@
 
 class tag
 {
-  const char *start, *finish;
+  std::string s;
 
   int cmp(const tag &other) const;
 public:
   class const_iterator
   {
-    const char *start, *finish, *limit;
+    std::string::const_iterator start, finish, limit;
 
     friend class tag;
   public:
-    const_iterator(const char *_start, const char *_finish,
-		   const char *_limit)
+    const_iterator(const std::string::const_iterator &_start,
+		   const std::string::const_iterator &_finish,
+		   const std::string::const_iterator &_limit)
       :start(_start), finish(_finish), limit(_limit)
     {
     }
@@ -70,16 +71,16 @@
 
     std::string operator*() const
     {
-      return std::string(start, finish-start);
+      return std::string(start, finish);
     }
   };
 
-  tag(const char *_start, const char *_finish);
+  tag(std::string::const_iterator _start,
+      std::string::const_iterator _finish);
 
   tag &operator=(const tag &other)
   {
-    start = other.start;
-    finish = other.finish;
+    s = other.s;
 
     return *this;
   }
@@ -117,25 +118,27 @@
   const_iterator begin() const;
   const_iterator end() const
   {
-    return const_iterator(finish, finish, finish);
+    return const_iterator(s.end(), s.end(), s.end());
   }
 
   std::string str() const
   {
-    return std::string(start, finish-start);
+    return s;
   }
 };
 
 class tag_list
 {
-  const char *start, *finish;
+  // The string to parse.
+  std::string s;
 public:
   class const_iterator
   {
-    const char *start, *finish, *limit;
+    std::string::const_iterator start, finish, limit;
   public:
-    const_iterator(const char *_start, const char *_finish,
-		   const char *_limit)
+    const_iterator(const std::string::const_iterator &_start,
+		   const std::string::const_iterator &_finish,
+		   const std::string::const_iterator &_limit)
       :start(_start), finish(_finish), limit(_limit)
     {
     }
@@ -167,21 +170,23 @@
     }
   };
 
-  tag_list(const char *_start, const char *_finish)
-    :start(_start), finish(_finish)
+  tag_list(const char *start, const char *finish)
+    :s(start, finish)
   {
   }
 
   tag_list &operator=(const tag_list &other)
   {
-    start = other.start;
-    finish = other.finish;
+    s=other.s;
 
     return *this;
   }
 
   const_iterator begin() const;
-  const_iterator end() const {return const_iterator(finish, finish, finish);}
+  const_iterator end() const
+  {
+    return const_iterator(s.end(), s.end(), s.end());
+  }
 };
 
 // Grab the tags for the given package:

Modified: branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc	Tue Jul 26 04:50:38 2005
@@ -70,9 +70,9 @@
 
   CPPUNIT_TEST_SUITE_END();
 private:
-  static tag parseTag(const char *s)
+  static tag parseTag(const std::string &s)
   {
-    return tag(s, s+strlen(s));
+    return tag(s.begin(), s.end());
   }
 
   // These should all parse to (tag1, tag2, tag3):



More information about the Aptitude-svn-commit mailing list