summaryrefslogtreecommitdiffstats
path: root/src/lib/exceptions
diff options
context:
space:
mode:
authorTomek Mrugalski <tomasz@isc.org>2015-08-27 19:13:33 +0200
committerTomek Mrugalski <tomasz@isc.org>2015-08-27 19:13:33 +0200
commitf3f4b5a8867be8e5b32589d1e7e90ce589977987 (patch)
treeca5a2f08276f85f7d5007d7651e5dd0387c3f5d8 /src/lib/exceptions
parent[master] ChangeLog updated after trac4000 merge. (diff)
downloadkea-f3f4b5a8867be8e5b32589d1e7e90ce589977987.tar.xz
kea-f3f4b5a8867be8e5b32589d1e7e90ce589977987.zip
[4025] Incorrect use of temporary object fixed in Exception::what()
Diffstat (limited to 'src/lib/exceptions')
-rw-r--r--src/lib/exceptions/exceptions.cc29
-rw-r--r--src/lib/exceptions/exceptions.h15
2 files changed, 30 insertions, 14 deletions
diff --git a/src/lib/exceptions/exceptions.cc b/src/lib/exceptions/exceptions.cc
index d1ed651010..de61ad0bee 100644
--- a/src/lib/exceptions/exceptions.cc
+++ b/src/lib/exceptions/exceptions.cc
@@ -13,13 +13,27 @@
// PERFORMANCE OF THIS SOFTWARE.
#include <string>
-
+#include <sstream>
#include <exceptions/exceptions.h>
using isc::Exception;
namespace isc {
+Exception::Exception(const char* file, size_t line, const char* what)
+: file_(file), line_(line), what_(what) {
+ std::stringstream location;
+ location << what_ << "[" << file_ << ":" << line_ << "]";
+ verbose_what_ = location.str();
+}
+
+Exception::Exception(const char* file, size_t line, const std::string& what)
+ : file_(file), line_(line), what_(what) {
+ std::stringstream location;
+ location << what_ << "[" << file_ << ":" << line_ << "]";
+ verbose_what_ = location.str();
+}
+
const char*
Exception::what() const throw() {
return (what(false));
@@ -28,25 +42,20 @@ Exception::what() const throw() {
const char*
Exception::what(bool verbose) const throw() {
- const char* whatstr = "isc::Exception";
-
- // XXX: Even though it's very unlikely that c_str() throws an exception,
+ // Even though it's very unlikely that c_str() throws an exception,
// it's still not 100% guaranteed. To meet the exception specification
// of this function, we catch any unexpected exception and fall back to
// the pre-defined constant.
try {
if (verbose) {
- static std::stringstream location;
- location.str("");
- location << what_ << "[" << file_ << ":" << line_ << "]";
- whatstr = location.str().c_str();
+ return (verbose_what_.c_str());
} else {
- whatstr = what_.c_str();
+ return (what_.c_str());
}
} catch (...) {
// no exception handling is necessary. just have to catch exceptions.
}
- return (whatstr);
+ return ("isc::Exception");
}
}
diff --git a/src/lib/exceptions/exceptions.h b/src/lib/exceptions/exceptions.h
index e9dc3d6d1d..fdea3a0f1b 100644
--- a/src/lib/exceptions/exceptions.h
+++ b/src/lib/exceptions/exceptions.h
@@ -40,8 +40,7 @@ public:
/// @param file the file name where the exception was thrown.
/// @param line the line in \a file where the exception was thrown.
/// @param what a description (type) of the exception.
- Exception(const char* file, size_t line, const char* what) :
- file_(file), line_(line), what_(what) {}
+ Exception(const char* file, size_t line, const char* what);
/// \brief Constructor for a given type for exceptions with file name and
/// file line number.
@@ -49,8 +48,7 @@ public:
/// @param file the file name where the exception was thrown.
/// @param line the line in \a file where the exception was thrown.
/// @param what a description (type) of the exception.
- Exception(const char* file, size_t line, const std::string& what) :
- file_(file), line_(line), what_(what) {}
+ Exception(const char* file, size_t line, const std::string& what);
/// The destructor
virtual ~Exception() throw() {}
@@ -106,9 +104,18 @@ public:
//@}
private:
+
+ /// Specifies the filename where this exception was raised
const char* const file_;
+
+ /// Specifies the line number where this exception was raised
size_t line_;
+
+ /// Specifies actual content of the exception
const std::string what_;
+
+ /// Specifies actual context of the exception (with file:line added)
+ std::string verbose_what_;
};
/// \brief A generic exception that is thrown if a parameter given