Kelson has submitted this change and it was merged.

Change subject: Bug fix: don't store pointers inside a dynamic vector.
......................................................................


Bug fix: don't store pointers inside a dynamic vector.

Use offsets instead, since the actual objects change location whenever
the std::vector resizes its internal storage.

This is a follow-up to f5de40f94b30795f42bb9388cbb46df9cd605167.

Change-Id: I166aa8dd209dd2755e68be70829f269a71a3aaca
---
M zimlib/include/zim/writer/zimcreator.h
M zimlib/src/zimcreator.cpp
2 files changed, 10 insertions(+), 8 deletions(-)

Approvals:
  Kelson: Verified; Looks good to me, approved



diff --git a/zimlib/include/zim/writer/zimcreator.h 
b/zimlib/include/zim/writer/zimcreator.h
index 2e52d7e..8ce2c44 100644
--- a/zimlib/include/zim/writer/zimcreator.h
+++ b/zimlib/include/zim/writer/zimcreator.h
@@ -33,7 +33,7 @@
     {
       public:
         typedef std::vector<Dirent> DirentsType;
-        typedef std::vector<Dirent*> DirentPtrsType;
+        typedef std::vector<DirentsType::size_type> DirentPtrsType;
         typedef std::vector<size_type> SizeVectorType;
         typedef std::vector<offset_type> OffsetsType;
         typedef std::map<std::string, uint16_t> MimeTypes;
diff --git a/zimlib/src/zimcreator.cpp b/zimlib/src/zimcreator.cpp
index 46c550f..9c024a7 100644
--- a/zimlib/src/zimcreator.cpp
+++ b/zimlib/src/zimcreator.cpp
@@ -232,7 +232,7 @@
         }
         dirents.back().setCluster(clusterOffsets.size(), cluster->count());
         cluster->addBlob(blob);
-        myDirents->push_back(&(dirents.back()));
+        myDirents->push_back(dirents.size()-1);
 
         // If cluster is now large enough, write it to disk.
         if (cluster->size() >= minChunkSize * 1024)
@@ -247,10 +247,11 @@
           cluster->clear();
           myDirents->clear();
           // Update the cluster number of the dirents *not* written to disk.
-          for (DirentPtrsType::iterator di = otherDirents->begin();
-               di != otherDirents->end(); ++di)
+          for (DirentPtrsType::iterator dpi = otherDirents->begin();
+               dpi != otherDirents->end(); ++dpi)
           {
-            (*di)->setCluster(clusterOffsets.size(), (*di)->getBlobNumber());
+            Dirent *di = &dirents[*dpi];
+            di->setCluster(clusterOffsets.size(), di->getBlobNumber());
           }
           offset_type end = out.tellp();
           currentSize += (end - start) +
@@ -263,10 +264,11 @@
       {
         clusterOffsets.push_back(out.tellp());
         out << compCluster;
-        for (DirentPtrsType::iterator di = uncompDirents.begin();
-             di != uncompDirents.end(); ++di)
+        for (DirentPtrsType::iterator dpi = uncompDirents.begin();
+             dpi != uncompDirents.end(); ++dpi)
         {
-          (*di)->setCluster(clusterOffsets.size(), (*di)->getBlobNumber());
+          Dirent *di = &dirents[*dpi];
+          di->setCluster(clusterOffsets.size(), di->getBlobNumber());
         }
       }
       compCluster.clear();

-- 
To view, visit https://gerrit.wikimedia.org/r/296644
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I166aa8dd209dd2755e68be70829f269a71a3aaca
Gerrit-PatchSet: 1
Gerrit-Project: openzim
Gerrit-Branch: master
Gerrit-Owner: Cscott <canan...@wikimedia.org>
Gerrit-Reviewer: Kelson <kel...@kiwix.org>
Gerrit-Reviewer: Mgautierfr <mgaut...@kymeria.fr>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to