Просмотр исходного кода

fix use-after-free in the IModelsArchiveReader class

The implementation has also been moved into a cpp file.
swarmer 1 год назад
Родитель
Сommit
db26b26fad

+ 15 - 0
library/cpp/archive/models_archive_reader.cpp

@@ -0,0 +1,15 @@
+#include "models_archive_reader.h"
+
+#include <util/generic/hash_set.h>
+
+THashSet<TStringBuf> IModelsArchiveReader::FilterByPrefix(TStringBuf prefix, TStringBuf suffix) const {
+    THashSet<TStringBuf> result;
+    const size_t count = Count();
+    for (size_t ind = 0; ind < count; ++ind) {
+        TString path = KeyByIndex(ind);
+        if (path.StartsWith(prefix) && path.EndsWith(suffix)) {
+            result.insert(std::move(path));
+        }
+    }
+    return result;
+}

+ 1 - 11
library/cpp/archive/models_archive_reader.h

@@ -2,7 +2,6 @@
 
 #include <util/generic/fwd.h>
 #include <util/generic/ptr.h>
-#include <util/generic/hash_set.h>
 
 class IInputStream;
 
@@ -18,14 +17,5 @@ public:
     virtual TBlob ObjectBlobByKey(const TStringBuf key) const = 0;
     virtual TBlob BlobByKey(const TStringBuf key) const = 0;
     virtual bool Compressed() const = 0;
-    virtual THashSet<TStringBuf> FilterByPrefix(TStringBuf prefix, TStringBuf suffix) const {
-        THashSet<TStringBuf> result;
-        for (size_t ind = 0; ind < Count(); ++ind) { 
-                TStringBuf path = KeyByIndex(ind);
-                if (path.StartsWith(prefix) && path.EndsWith(suffix)) {
-                    result.insert(path);
-                }
-        }
-        return result;
-    }
+    virtual THashSet<TStringBuf> FilterByPrefix(TStringBuf prefix, TStringBuf suffix) const;
 };

+ 1 - 0
library/cpp/archive/ya.make

@@ -5,6 +5,7 @@ SRCS(
     yarchive.h
     directory_models_archive_reader.cpp
     directory_models_archive_reader.h
+    models_archive_reader.cpp
 )
 
 END()