diff options
author | Tomek Mrugalski <tomasz@isc.org> | 2015-08-27 19:13:33 +0200 |
---|---|---|
committer | Tomek Mrugalski <tomasz@isc.org> | 2015-08-27 19:13:33 +0200 |
commit | f3f4b5a8867be8e5b32589d1e7e90ce589977987 (patch) | |
tree | ca5a2f08276f85f7d5007d7651e5dd0387c3f5d8 /src/lib/exceptions | |
parent | [master] ChangeLog updated after trac4000 merge. (diff) | |
download | kea-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.cc | 29 | ||||
-rw-r--r-- | src/lib/exceptions/exceptions.h | 15 |
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 |