diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-16 15:09:55 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-16 15:09:55 +0100 |
commit | 707f64b85c8a1b88923617ff72bd8a4ca562f3bd (patch) | |
tree | 19543e9df7d87a2204e944a332158137805e9a92 /lib/Utils | |
parent | 1eae9a2bcc8583bf54ec7027ead9b0ae01861481 (diff) | |
download | abrt-707f64b85c8a1b88923617ff72bd8a4ca562f3bd.tar.gz abrt-707f64b85c8a1b88923617ff72bd8a4ca562f3bd.tar.xz abrt-707f64b85c8a1b88923617ff72bd8a4ca562f3bd.zip |
prevent destructors from throwing exceptions; check curl_easy_init errors
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'lib/Utils')
-rw-r--r-- | lib/Utils/DebugDump.cpp | 16 | ||||
-rw-r--r-- | lib/Utils/DebugDump.h | 2 | ||||
-rw-r--r-- | lib/Utils/abrt_xmlrpc.cpp | 10 | ||||
-rw-r--r-- | lib/Utils/abrt_xmlrpc.h | 5 |
4 files changed, 31 insertions, 2 deletions
diff --git a/lib/Utils/DebugDump.cpp b/lib/Utils/DebugDump.cpp index 765b5146..b4c3ee49 100644 --- a/lib/Utils/DebugDump.cpp +++ b/lib/Utils/DebugDump.cpp @@ -68,6 +68,22 @@ CDebugDump::CDebugDump() : m_bLocked(false) {} +CDebugDump::~CDebugDump() +{ + /* Paranoia. In C++, destructor will abort() if it was called while unwinding + * the stack and it throws an exception. + */ + try + { + Close(); + m_sDebugDumpDir.clear(); + } + catch (...) + { + error_msg_and_die("Internal error"); + } +} + void CDebugDump::Open(const char *pDir) { if (m_bOpened) diff --git a/lib/Utils/DebugDump.h b/lib/Utils/DebugDump.h index fad39ecb..c59552e9 100644 --- a/lib/Utils/DebugDump.h +++ b/lib/Utils/DebugDump.h @@ -59,7 +59,7 @@ class CDebugDump public: CDebugDump(); - ~CDebugDump() { Close(); } + ~CDebugDump(); void Open(const char *pDir); void Create(const char *pDir, int64_t uid); diff --git a/lib/Utils/abrt_xmlrpc.cpp b/lib/Utils/abrt_xmlrpc.cpp index 7205316c..ae1d098e 100644 --- a/lib/Utils/abrt_xmlrpc.cpp +++ b/lib/Utils/abrt_xmlrpc.cpp @@ -5,6 +5,16 @@ #include "abrt_xmlrpc.h" #include "ABRTException.h" +CURL* xcurl_easy_init() +{ + CURL* curl = curl_easy_init(); + if (!curl) + { + error_msg_and_die("Can't create curl handle"); + } + return curl; +} + void throw_if_xml_fault_occurred(xmlrpc_env *env) { if (env->fault_occurred) diff --git a/lib/Utils/abrt_xmlrpc.h b/lib/Utils/abrt_xmlrpc.h index e67ab19a..352e80ca 100644 --- a/lib/Utils/abrt_xmlrpc.h +++ b/lib/Utils/abrt_xmlrpc.h @@ -1,6 +1,7 @@ #ifndef ABRT_XMLRPC_H_ #define ABRT_XMLRPC_H_ 1 +#include <curl/curl.h> #include <xmlrpc-c/base.h> #include <xmlrpc-c/client.h> @@ -15,13 +16,15 @@ struct abrt_xmlrpc_conn { xmlrpc_server_info* m_pServer_info; abrt_xmlrpc_conn(const char* url, bool no_ssl_verify) { new_xmlrpc_client(url, no_ssl_verify); } + /* this never throws exceptions - calls C functions only */ ~abrt_xmlrpc_conn() { destroy_xmlrpc_client(); } void new_xmlrpc_client(const char* url, bool no_ssl_verify); void destroy_xmlrpc_client(); }; -/* Utility function */ +/* Utility functions */ void throw_if_xml_fault_occurred(xmlrpc_env *env); +CURL* xcurl_easy_init(); #endif |