commit 9c6e336562f64267a8c3fb5ad8492d4504c9117a
parent 892163e44aa57a8ae6cee0a45a887f36816a9a80
Author: cfillion <cfillion@users.noreply.github.com>
Date: Tue, 12 Jul 2016 22:47:28 -0400
fix a memory leak occuring when loading equivalent versions
Diffstat:
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/src/errors.hpp b/src/errors.hpp
@@ -18,11 +18,13 @@
#ifndef REAPACK_ERRORS_HPP
#define REAPACK_ERRORS_HPP
+#include <boost/format.hpp>
#include <stdexcept>
class reapack_error : public std::runtime_error {
public:
reapack_error(const char *what) : std::runtime_error(what) {}
+ reapack_error(const boost::format &f) : std::runtime_error(f.str()) {}
};
#endif
diff --git a/src/package.cpp b/src/package.cpp
@@ -23,6 +23,7 @@
#include <algorithm>
#include <boost/range/adaptor/reversed.hpp>
+using boost::format;
using namespace std;
Package::Type Package::getType(const char *type)
@@ -81,11 +82,13 @@ bool Package::addVersion(const Version *ver)
{
if(ver->package() != this)
throw reapack_error("version belongs to another package");
-
- if(ver->sources().empty())
+ else if(ver->sources().empty())
return false;
+ else if(m_versions.count(ver))
+ throw reapack_error(format("duplicate version '%1%'") % ver->fullName());
m_versions.insert(ver);
+
return true;
}
diff --git a/test/package.cpp b/test/package.cpp
@@ -175,6 +175,24 @@ TEST_CASE("add owned version", M) {
}
}
+TEST_CASE("add duplicate version", M) {
+ Index ri("r");
+ Category cat("c", &ri);
+ Package pack(Package::ScriptType, "p", &cat);
+
+ Version *ver = new Version("1", &pack);
+ ver->addSource(new Source({}, "google.com", ver));
+ pack.addVersion(ver);
+
+ try {
+ pack.addVersion(ver); // could also be an equivalent version with same value
+ FAIL();
+ }
+ catch(const reapack_error &e) {
+ REQUIRE(string(e.what()) == "duplicate version 'r/c/p v1'");
+ }
+}
+
TEST_CASE("find matching version", M) {
Index ri("Remote Name");
Category cat("Category Name", &ri);