From 764c3a1e4f21c635c565cf5c20c480dbf48d1599 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 19 Jan 2010 16:48:54 +0100 Subject: unify "crash data, "crash info" and "crash report" data types. they are the same Signed-off-by: Denys Vlasenko --- src/Daemon/MiddleWare.cpp | 138 ++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 67 deletions(-) (limited to 'src/Daemon/MiddleWare.cpp') diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index c2a122a..af52b85 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -124,9 +124,9 @@ static char* is_text_file(const char *name, ssize_t *sz) * Transforms a debugdump direcortry to inner crash * report form. This form is used for later reporting. * @param pDebugDumpDir A debugdump dir containing all necessary data. - * @param pCrashReport A created crash report. + * @param pCrashData A created crash report. */ -static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_report_t& pCrashReport) +static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& pCrashData) { CDebugDump dd; dd.Open(pDebugDumpDir); @@ -142,7 +142,7 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_report_t std::string short_name; std::string full_name; - pCrashReport.clear(); + pCrashData.clear(); dd.InitGetNextFile(); while (dd.GetNextFile(&short_name, &full_name)) { @@ -150,11 +150,11 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_report_t char *text = is_text_file(full_name.c_str(), &sz); if (!text) { - add_crash_data_to_crash_report(pCrashReport, - short_name, - CD_BIN, - CD_ISNOTEDITABLE, - full_name + add_to_crash_data_ext(pCrashData, + short_name.c_str(), + CD_BIN, + CD_ISNOTEDITABLE, + full_name.c_str() ); continue; } @@ -173,7 +173,12 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_report_t || short_name == FILENAME_RELEASE || short_name == FILENAME_EXECUTABLE ) { - add_crash_data_to_crash_report(pCrashReport, short_name, CD_TXT, CD_ISNOTEDITABLE, content); + add_to_crash_data_ext(pCrashData, + short_name.c_str(), + CD_TXT, + CD_ISNOTEDITABLE, + content.c_str() + ); continue; } @@ -184,12 +189,12 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_report_t && short_name != FILENAME_REPRODUCE && short_name != FILENAME_COMMENT ) { - add_crash_data_to_crash_report( - pCrashReport, - short_name, + add_to_crash_data_ext( + pCrashData, + short_name.c_str(), CD_TXT, CD_ISEDITABLE, - content + content.c_str() ); } } @@ -250,7 +255,7 @@ static void CreateReport(const char *pAnalyzer, mw_result_t CreateCrashReport(const char *pUUID, const char *pUID, int force, - map_crash_report_t& pCrashReport) + map_crash_data_t& pCrashData) { VERB2 log("CreateCrashReport('%s','%s',result)", pUUID, pUID); @@ -272,7 +277,6 @@ mw_result_t CreateCrashReport(const char *pUUID, { CDebugDump dd; std::string analyzer; - std::string gUUID; std::string comment; std::string reproduce = "1.\n2.\n3.\n"; @@ -292,20 +296,20 @@ mw_result_t CreateCrashReport(const char *pUUID, VERB3 log(" CreateReport('%s')", analyzer.c_str()); CreateReport(analyzer.c_str(), row.m_sDebugDumpDir.c_str(), force); - gUUID = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); + std::string gUUID = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str()); VERB3 log(" RunAnalyzerActions"); RunAnalyzerActions(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); VERB3 log(" DebugDumpToCrashReport"); - DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashReport); + DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashData); - add_crash_data_to_crash_report(pCrashReport, CD_UUID, CD_TXT, CD_ISNOTEDITABLE, gUUID); - add_crash_data_to_crash_report(pCrashReport, CD_MWANALYZER, CD_SYS, CD_ISNOTEDITABLE, analyzer); - add_crash_data_to_crash_report(pCrashReport, CD_MWUID, CD_SYS, CD_ISNOTEDITABLE, pUID); - add_crash_data_to_crash_report(pCrashReport, CD_MWUUID, CD_SYS, CD_ISNOTEDITABLE, pUUID); - add_crash_data_to_crash_report(pCrashReport, CD_COMMENT, CD_TXT, CD_ISEDITABLE, comment); - add_crash_data_to_crash_report(pCrashReport, CD_REPRODUCE, CD_TXT, CD_ISEDITABLE, reproduce); + add_to_crash_data_ext(pCrashData, CD_UUID , CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str() ); + add_to_crash_data_ext(pCrashData, CD_MWANALYZER, CD_SYS, CD_ISNOTEDITABLE, analyzer.c_str() ); + add_to_crash_data_ext(pCrashData, CD_MWUID , CD_SYS, CD_ISNOTEDITABLE, pUID ); + add_to_crash_data_ext(pCrashData, CD_MWUUID , CD_SYS, CD_ISNOTEDITABLE, pUUID ); + add_to_crash_data_ext(pCrashData, CD_COMMENT , CD_TXT, CD_ISEDITABLE , comment.c_str() ); + add_to_crash_data_ext(pCrashData, CD_REPRODUCE , CD_TXT, CD_ISEDITABLE , reproduce.c_str()); } catch (CABRTException& e) { @@ -362,7 +366,7 @@ void RunActionsAndReporters(const char *pDebugDumpDir) if (tp == REPORTER) { CReporter* reporter = g_pPluginManager->GetReporter(plugin_name); /* can't be NULL */ - map_crash_report_t crashReport; + map_crash_data_t crashReport; DebugDumpToCrashReport(pDebugDumpDir, crashReport); VERB2 log("%s.Report(...)", plugin_name); reporter->Report(crashReport, plugin_settings, it_ar->second.c_str()); @@ -382,20 +386,20 @@ void RunActionsAndReporters(const char *pDebugDumpDir) } -static bool CheckReport(const map_crash_report_t& pCrashReport) +static bool CheckReport(const map_crash_data_t& pCrashData) { - map_crash_report_t::const_iterator it_analyzer = pCrashReport.find(CD_MWANALYZER); - map_crash_report_t::const_iterator it_mwuid = pCrashReport.find(CD_MWUID); - map_crash_report_t::const_iterator it_mwuuid = pCrashReport.find(CD_MWUUID); + map_crash_data_t::const_iterator it_analyzer = pCrashData.find(CD_MWANALYZER); + map_crash_data_t::const_iterator it_mwuid = pCrashData.find(CD_MWUID); + map_crash_data_t::const_iterator it_mwuuid = pCrashData.find(CD_MWUUID); - map_crash_report_t::const_iterator it_package = pCrashReport.find(FILENAME_PACKAGE); - map_crash_report_t::const_iterator it_architecture = pCrashReport.find(FILENAME_ARCHITECTURE); - map_crash_report_t::const_iterator it_kernel = pCrashReport.find(FILENAME_KERNEL); - map_crash_report_t::const_iterator it_component = pCrashReport.find(FILENAME_COMPONENT); - map_crash_report_t::const_iterator it_release = pCrashReport.find(FILENAME_RELEASE); - map_crash_report_t::const_iterator it_executable = pCrashReport.find(FILENAME_EXECUTABLE); + map_crash_data_t::const_iterator it_package = pCrashData.find(FILENAME_PACKAGE); + map_crash_data_t::const_iterator it_architecture = pCrashData.find(FILENAME_ARCHITECTURE); + map_crash_data_t::const_iterator it_kernel = pCrashData.find(FILENAME_KERNEL); + map_crash_data_t::const_iterator it_component = pCrashData.find(FILENAME_COMPONENT); + map_crash_data_t::const_iterator it_release = pCrashData.find(FILENAME_RELEASE); + map_crash_data_t::const_iterator it_executable = pCrashData.find(FILENAME_EXECUTABLE); - map_crash_report_t::const_iterator end = pCrashReport.end(); + map_crash_data_t::const_iterator end = pCrashData.end(); if (it_package == end) { @@ -427,38 +431,38 @@ static bool CheckReport(const map_crash_report_t& pCrashReport) return true; } -report_status_t Report(const map_crash_report_t& pCrashReport, +report_status_t Report(const map_crash_data_t& pCrashData, map_map_string_t& pSettings, const char *pUID) { report_status_t ret; - /* dbus handler passes pCrashReport from user without checking it */ + /* dbus handler passes pCrashData from user without checking it */ - if (!CheckReport(pCrashReport)) + if (!CheckReport(pCrashData)) { throw CABRTException(EXCEP_ERROR, "Report(): Some of mandatory report data are missing."); } - std::string analyzer = pCrashReport.find(CD_MWANALYZER)->second[CD_CONTENT]; - std::string UID = pCrashReport.find(CD_MWUID)->second[CD_CONTENT]; - std::string UUID = pCrashReport.find(CD_MWUUID)->second[CD_CONTENT]; - std::string packageNVR = pCrashReport.find(FILENAME_PACKAGE)->second[CD_CONTENT]; + std::string analyzer = pCrashData.find(CD_MWANALYZER)->second[CD_CONTENT]; + std::string UID = pCrashData.find(CD_MWUID)->second[CD_CONTENT]; + std::string UUID = pCrashData.find(CD_MWUUID)->second[CD_CONTENT]; + std::string packageNVR = pCrashData.find(FILENAME_PACKAGE)->second[CD_CONTENT]; std::string packageName = packageNVR.substr(0, packageNVR.rfind("-", packageNVR.rfind("-") - 1)); // Save comment and "how to reproduce" - map_crash_report_t::const_iterator it_comment = pCrashReport.find(CD_COMMENT); - map_crash_report_t::const_iterator it_reproduce = pCrashReport.find(CD_REPRODUCE); - if (it_comment != pCrashReport.end() || it_reproduce != pCrashReport.end()) + map_crash_data_t::const_iterator it_comment = pCrashData.find(CD_COMMENT); + map_crash_data_t::const_iterator it_reproduce = pCrashData.find(CD_REPRODUCE); + if (it_comment != pCrashData.end() || it_reproduce != pCrashData.end()) { std::string pDumpDir = getDebugDumpDir(UUID.c_str(), UID.c_str()); CDebugDump dd; dd.Open(pDumpDir.c_str()); - if (it_comment != pCrashReport.end()) + if (it_comment != pCrashData.end()) { dd.SaveText(FILENAME_COMMENT, it_comment->second[CD_CONTENT].c_str()); } - if (it_reproduce != pCrashReport.end()) + if (it_reproduce != pCrashData.end()) { dd.SaveText(FILENAME_REPRODUCE, it_reproduce->second[CD_CONTENT].c_str()); } @@ -509,7 +513,7 @@ report_status_t Report(const map_crash_report_t& pCrashReport, } #endif map_plugin_settings_t plugin_settings = pSettings[plugin_name]; - std::string res = reporter->Report(pCrashReport, plugin_settings, it_r->second.c_str()); + std::string res = reporter->Report(pCrashData, plugin_settings, it_r->second.c_str()); #if 0 /* Using ~user/.abrt/ is bad wrt security */ if (home != "") @@ -767,7 +771,7 @@ bool analyzer_has_AutoReportUIDs(const char *analyzer_name, const char* uid) return false; } -void autoreport(const pair_string_string_t& reporter_options, const map_crash_report_t& crash_report) +void autoreport(const pair_string_string_t& reporter_options, const map_crash_data_t& crash_report) { CReporter* reporter = g_pPluginManager->GetReporter(reporter_options.first.c_str()); if (!reporter) @@ -821,14 +825,14 @@ static void RunAnalyzerActions(const char *pAnalyzer, const char *pDebugDumpDir) * @param pUID An UID of an user. * @param pTime Time when a crash occurs. * @param pDebugDumpPath A debugdump path. - * @param pCrashInfo A filled crash info. + * @param pCrashData A filled crash info. * @return It return results of operation. See mw_result_t. */ static mw_result_t SaveDebugDumpToDatabase(const char *pUUID, const char *pUID, const char *pTime, const char *pDebugDumpDir, - map_crash_info_t& pCrashInfo) + map_crash_data_t& pCrashData) { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); @@ -837,7 +841,7 @@ static mw_result_t SaveDebugDumpToDatabase(const char *pUUID, database_row_t row = database->GetRow(pUUID, pUID); database->DisConnect(); - mw_result_t res = FillCrashInfo(pUUID, pUID, pCrashInfo); + mw_result_t res = FillCrashInfo(pUUID, pUID, pCrashData); if (res == MW_OK) { if (row.m_sReported == "1") @@ -865,7 +869,7 @@ std::string getDebugDumpDir(const char *pUUID, } mw_result_t SaveDebugDump(const char *pDebugDumpDir, - map_crash_info_t& pCrashInfo) + map_crash_data_t& pCrashData) { std::string UID; std::string time; @@ -907,12 +911,12 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, const char *uid_str = analyzer_has_InformAllUsers(analyzer.c_str()) ? "-1" : UID.c_str(); - return SaveDebugDumpToDatabase(lUUID.c_str(), uid_str, time.c_str(), pDebugDumpDir, pCrashInfo); + return SaveDebugDumpToDatabase(lUUID.c_str(), uid_str, time.c_str(), pDebugDumpDir, pCrashData); } mw_result_t FillCrashInfo(const char *pUUID, const char *pUID, - map_crash_info_t& pCrashInfo) + map_crash_data_t& pCrashData) { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); @@ -938,18 +942,18 @@ mw_result_t FillCrashInfo(const char *pUUID, return MW_ERROR; } - pCrashInfo.clear(); - add_crash_data_to_crash_info(pCrashInfo, CD_EXECUTABLE, executable); - add_crash_data_to_crash_info(pCrashInfo, CD_PACKAGE, package); - add_crash_data_to_crash_info(pCrashInfo, CD_DESCRIPTION, description); - add_crash_data_to_crash_info(pCrashInfo, CD_UUID, row.m_sUUID); - add_crash_data_to_crash_info(pCrashInfo, CD_UID, row.m_sUID); - add_crash_data_to_crash_info(pCrashInfo, CD_COUNT, row.m_sCount); - add_crash_data_to_crash_info(pCrashInfo, CD_TIME, row.m_sTime); - add_crash_data_to_crash_info(pCrashInfo, CD_REPORTED, row.m_sReported); - add_crash_data_to_crash_info(pCrashInfo, CD_MESSAGE, row.m_sMessage); - add_crash_data_to_crash_info(pCrashInfo, CD_MWDDD, row.m_sDebugDumpDir); - add_crash_data_to_crash_info(pCrashInfo, CD_MWANALYZER, analyzer); + pCrashData.clear(); + add_to_crash_data(pCrashData, CD_EXECUTABLE , executable.c_str() ); + add_to_crash_data(pCrashData, CD_PACKAGE , package.c_str() ); + add_to_crash_data(pCrashData, CD_DESCRIPTION, description.c_str() ); + add_to_crash_data(pCrashData, CD_UUID , row.m_sUUID.c_str() ); + add_to_crash_data(pCrashData, CD_UID , row.m_sUID.c_str() ); + add_to_crash_data(pCrashData, CD_COUNT , row.m_sCount.c_str() ); + add_to_crash_data(pCrashData, CD_TIME , row.m_sTime.c_str() ); + add_to_crash_data(pCrashData, CD_REPORTED , row.m_sReported.c_str() ); + add_to_crash_data(pCrashData, CD_MESSAGE , row.m_sMessage.c_str() ); + add_to_crash_data(pCrashData, CD_MWDDD , row.m_sDebugDumpDir.c_str()); + add_to_crash_data(pCrashData, CD_MWANALYZER , analyzer.c_str() ); return MW_OK; } -- cgit From c781b46915c73f8f7b12efddd0357930eb1df8bb Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 19 Jan 2010 18:08:01 +0100 Subject: move all FILENAME_xxx defines to inc/CrashTypes.h Signed-off-by: Denys Vlasenko --- src/Daemon/MiddleWare.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/Daemon/MiddleWare.cpp') diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index af52b85..50d0aca 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -85,8 +85,8 @@ static char* is_text_file(const char *name, ssize_t *sz) } /* Some files in our dump directories are known to always be textual */ - if (strcmp(name, "backtrace") == 0 - || strcmp(name, "cmdline") == 0 + if (strcmp(name, FILENAME_BACKTRACE) == 0 + || strcmp(name, FILENAME_CMDLINE) == 0 ) { return buf; } -- cgit From 9edadbfa15ed05a3e48158aad89e438a6f9a9e50 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 19 Jan 2010 21:02:05 +0100 Subject: use get_crash_data_item_content() more widely. -4k. Signed-off-by: Denys Vlasenko --- src/Daemon/MiddleWare.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/Daemon/MiddleWare.cpp') diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 50d0aca..4f24ee1 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -444,10 +444,10 @@ report_status_t Report(const map_crash_data_t& pCrashData, throw CABRTException(EXCEP_ERROR, "Report(): Some of mandatory report data are missing."); } - std::string analyzer = pCrashData.find(CD_MWANALYZER)->second[CD_CONTENT]; - std::string UID = pCrashData.find(CD_MWUID)->second[CD_CONTENT]; - std::string UUID = pCrashData.find(CD_MWUUID)->second[CD_CONTENT]; - std::string packageNVR = pCrashData.find(FILENAME_PACKAGE)->second[CD_CONTENT]; + const std::string& analyzer = get_crash_data_item_content(pCrashData, CD_MWANALYZER); + const std::string& UID = get_crash_data_item_content(pCrashData, CD_MWUID); + const std::string& UUID = get_crash_data_item_content(pCrashData, CD_MWUUID); + const std::string& packageNVR = get_crash_data_item_content(pCrashData, FILENAME_PACKAGE); std::string packageName = packageNVR.substr(0, packageNVR.rfind("-", packageNVR.rfind("-") - 1)); // Save comment and "how to reproduce" -- cgit From 562cb414ee83452749058c2c976019c663111e55 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 20 Jan 2010 16:42:17 +0100 Subject: split load_crash_data_from_debug_dump from DebugDumpToCrashReport We will need it elsewhere later Signed-off-by: Denys Vlasenko --- src/Daemon/MiddleWare.cpp | 53 ++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 24 deletions(-) (limited to 'src/Daemon/MiddleWare.cpp') diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 4f24ee1..a2b20e6 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -120,29 +120,11 @@ static char* is_text_file(const char *name, ssize_t *sz) return NULL; /* it's binary */ } -/** - * Transforms a debugdump direcortry to inner crash - * report form. This form is used for later reporting. - * @param pDebugDumpDir A debugdump dir containing all necessary data. - * @param pCrashData A created crash report. - */ -static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& pCrashData) +static void load_crash_data_from_debug_dump(CDebugDump& dd, map_crash_data_t& data) { - CDebugDump dd; - dd.Open(pDebugDumpDir); - if (!dd.Exist(FILENAME_ARCHITECTURE) - || !dd.Exist(FILENAME_KERNEL) - || !dd.Exist(FILENAME_PACKAGE) - || !dd.Exist(FILENAME_COMPONENT) - || !dd.Exist(FILENAME_RELEASE) - || !dd.Exist(FILENAME_EXECUTABLE) - ) { - throw CABRTException(EXCEP_ERROR, "DebugDumpToCrashReport(): One or more of important file(s) are missing"); - } - std::string short_name; std::string full_name; - pCrashData.clear(); + dd.InitGetNextFile(); while (dd.GetNextFile(&short_name, &full_name)) { @@ -150,7 +132,7 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& char *text = is_text_file(full_name.c_str(), &sz); if (!text) { - add_to_crash_data_ext(pCrashData, + add_to_crash_data_ext(data, short_name.c_str(), CD_BIN, CD_ISNOTEDITABLE, @@ -173,7 +155,7 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& || short_name == FILENAME_RELEASE || short_name == FILENAME_EXECUTABLE ) { - add_to_crash_data_ext(pCrashData, + add_to_crash_data_ext(data, short_name.c_str(), CD_TXT, CD_ISNOTEDITABLE, @@ -190,7 +172,7 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& && short_name != FILENAME_COMMENT ) { add_to_crash_data_ext( - pCrashData, + data, short_name.c_str(), CD_TXT, CD_ISEDITABLE, @@ -200,6 +182,29 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& } } +/** + * Transforms a debugdump directory to inner crash + * report form. This form is used for later reporting. + * @param pDebugDumpDir A debugdump dir containing all necessary data. + * @param pCrashData A created crash report. + */ +static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& pCrashData) +{ + CDebugDump dd; + dd.Open(pDebugDumpDir); + if (!dd.Exist(FILENAME_ARCHITECTURE) + || !dd.Exist(FILENAME_KERNEL) + || !dd.Exist(FILENAME_PACKAGE) + || !dd.Exist(FILENAME_COMPONENT) + || !dd.Exist(FILENAME_RELEASE) + || !dd.Exist(FILENAME_EXECUTABLE) + ) { + throw CABRTException(EXCEP_ERROR, "DebugDumpToCrashReport(): One or more of important file(s) are missing"); + } + + load_crash_data_from_debug_dump(dd, pCrashData); +} + /** * Get a local UUID from particular analyzer plugin. * @param pAnalyzer A name of an analyzer plugin. @@ -299,7 +304,7 @@ mw_result_t CreateCrashReport(const char *pUUID, std::string gUUID = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str()); - VERB3 log(" RunAnalyzerActions"); + VERB3 log(" RunAnalyzerActions('%s','%s')", analyzer.c_str(), row.m_sDebugDumpDir.c_str()); RunAnalyzerActions(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); VERB3 log(" DebugDumpToCrashReport"); DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashData); -- cgit From 1a3447c52fe47cca5d72d0a15cbbca9f6d18eb50 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 20 Jan 2010 20:26:28 +0100 Subject: use get_crash_data_item_content() accessor more widely Signed-off-by: Denys Vlasenko --- src/Daemon/MiddleWare.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/Daemon/MiddleWare.cpp') diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index a2b20e6..9ca492d 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -863,8 +863,7 @@ static mw_result_t SaveDebugDumpToDatabase(const char *pUUID, return res; } -std::string getDebugDumpDir(const char *pUUID, - const char *pUID) +std::string getDebugDumpDir(const char *pUUID, const char *pUID) { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); -- cgit From 6443695f275167adb123070daf2a6b6ecc0bb371 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 21 Jan 2010 02:56:53 +0100 Subject: abrtd: fix Report() dbus call gaping security holes We were blindly trusting the values passed to us Signed-off-by: Denys Vlasenko --- src/Daemon/MiddleWare.cpp | 231 +++++++++++++++++++--------------------------- 1 file changed, 94 insertions(+), 137 deletions(-) (limited to 'src/Daemon/MiddleWare.cpp') diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 9ca492d..ecf3c13 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -148,37 +148,12 @@ static void load_crash_data_from_debug_dump(CDebugDump& dd, map_crash_data_t& da dd.LoadText(short_name.c_str(), content); free(text); - if (short_name == FILENAME_ARCHITECTURE - || short_name == FILENAME_KERNEL - || short_name == FILENAME_PACKAGE - || short_name == FILENAME_COMPONENT - || short_name == FILENAME_RELEASE - || short_name == FILENAME_EXECUTABLE - ) { - add_to_crash_data_ext(data, - short_name.c_str(), - CD_TXT, - CD_ISNOTEDITABLE, - content.c_str() - ); - continue; - } - - if (short_name != FILENAME_UID - && short_name != FILENAME_ANALYZER - && short_name != FILENAME_TIME - && short_name != FILENAME_DESCRIPTION - && short_name != FILENAME_REPRODUCE - && short_name != FILENAME_COMMENT - ) { - add_to_crash_data_ext( - data, - short_name.c_str(), - CD_TXT, - CD_ISEDITABLE, - content.c_str() - ); - } + add_to_crash_data_ext(data, + short_name.c_str(), + CD_TXT, + is_editable_file(short_name.c_str()) ? CD_ISEDITABLE : CD_ISNOTEDITABLE, + content.c_str() + ); } } @@ -190,16 +165,19 @@ static void load_crash_data_from_debug_dump(CDebugDump& dd, map_crash_data_t& da */ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t& pCrashData) { + VERB3 log(" DebugDumpToCrashReport('%s')", pDebugDumpDir); + CDebugDump dd; dd.Open(pDebugDumpDir); - if (!dd.Exist(FILENAME_ARCHITECTURE) - || !dd.Exist(FILENAME_KERNEL) - || !dd.Exist(FILENAME_PACKAGE) - || !dd.Exist(FILENAME_COMPONENT) - || !dd.Exist(FILENAME_RELEASE) - || !dd.Exist(FILENAME_EXECUTABLE) - ) { - throw CABRTException(EXCEP_ERROR, "DebugDumpToCrashReport(): One or more of important file(s) are missing"); + + const char *const *v = must_have_files; + while (*v) + { + if (!dd.Exist(*v)) + { + throw CABRTException(EXCEP_ERROR, "DebugDumpToCrashReport(): important file '%s' is missing", *v); + } + v++; } load_crash_data_from_debug_dump(dd, pCrashData); @@ -245,7 +223,7 @@ static std::string GetGlobalUUID(const char *pAnalyzer, * @param pAnalyzer A name of an analyzer plugin. * @param pDebugDumpPath A debugdump dir containing all necessary data. */ -static void CreateReport(const char *pAnalyzer, +static void run_analyser_CreateReport(const char *pAnalyzer, const char *pDebugDumpDir, int force) { @@ -278,6 +256,7 @@ mw_result_t CreateCrashReport(const char *pUUID, return MW_IN_DB_ERROR; } + mw_result_t r = MW_OK; try { CDebugDump dd; @@ -296,45 +275,42 @@ mw_result_t CreateCrashReport(const char *pUUID, { dd.LoadText(FILENAME_REPRODUCE, reproduce); } + load_crash_data_from_debug_dump(dd, pCrashData); dd.Close(); VERB3 log(" CreateReport('%s')", analyzer.c_str()); - CreateReport(analyzer.c_str(), row.m_sDebugDumpDir.c_str(), force); + run_analyser_CreateReport(analyzer.c_str(), row.m_sDebugDumpDir.c_str(), force); std::string gUUID = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str()); VERB3 log(" RunAnalyzerActions('%s','%s')", analyzer.c_str(), row.m_sDebugDumpDir.c_str()); RunAnalyzerActions(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); - VERB3 log(" DebugDumpToCrashReport"); DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashData); - add_to_crash_data_ext(pCrashData, CD_UUID , CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str() ); - add_to_crash_data_ext(pCrashData, CD_MWANALYZER, CD_SYS, CD_ISNOTEDITABLE, analyzer.c_str() ); - add_to_crash_data_ext(pCrashData, CD_MWUID , CD_SYS, CD_ISNOTEDITABLE, pUID ); - add_to_crash_data_ext(pCrashData, CD_MWUUID , CD_SYS, CD_ISNOTEDITABLE, pUUID ); - add_to_crash_data_ext(pCrashData, CD_COMMENT , CD_TXT, CD_ISEDITABLE , comment.c_str() ); - add_to_crash_data_ext(pCrashData, CD_REPRODUCE , CD_TXT, CD_ISEDITABLE , reproduce.c_str()); + add_to_crash_data_ext(pCrashData, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str()); + add_to_crash_data_ext(pCrashData, CD_UUID , CD_SYS, CD_ISNOTEDITABLE, pUUID); } catch (CABRTException& e) { + r = MW_CORRUPTED; error_msg("%s", e.what()); if (e.type() == EXCEP_DD_OPEN) { - return MW_ERROR; + r = MW_ERROR; } - if (e.type() == EXCEP_DD_LOAD) + else if (e.type() == EXCEP_DD_LOAD) { - return MW_FILE_ERROR; + r = MW_FILE_ERROR; } - if (e.type() == EXCEP_PLUGIN) + else if (e.type() == EXCEP_PLUGIN) { - return MW_PLUGIN_ERROR; + r = MW_PLUGIN_ERROR; } - return MW_CORRUPTED; } - return MW_OK; + VERB3 log("CreateCrashReport() returns %d", r); + return r; } void RunAction(const char *pActionDir, @@ -391,88 +367,74 @@ void RunActionsAndReporters(const char *pDebugDumpDir) } -static bool CheckReport(const map_crash_data_t& pCrashData) -{ - map_crash_data_t::const_iterator it_analyzer = pCrashData.find(CD_MWANALYZER); - map_crash_data_t::const_iterator it_mwuid = pCrashData.find(CD_MWUID); - map_crash_data_t::const_iterator it_mwuuid = pCrashData.find(CD_MWUUID); - - map_crash_data_t::const_iterator it_package = pCrashData.find(FILENAME_PACKAGE); - map_crash_data_t::const_iterator it_architecture = pCrashData.find(FILENAME_ARCHITECTURE); - map_crash_data_t::const_iterator it_kernel = pCrashData.find(FILENAME_KERNEL); - map_crash_data_t::const_iterator it_component = pCrashData.find(FILENAME_COMPONENT); - map_crash_data_t::const_iterator it_release = pCrashData.find(FILENAME_RELEASE); - map_crash_data_t::const_iterator it_executable = pCrashData.find(FILENAME_EXECUTABLE); - - map_crash_data_t::const_iterator end = pCrashData.end(); - - if (it_package == end) - { - return false; - } - - // FIXME: bypass the test if it's kerneloops - if (it_package->second[CD_CONTENT] == "kernel") - return true; - - if (it_analyzer == end || it_mwuid == end || - it_mwuuid == end || /* it_package == end || */ - it_architecture == end || it_kernel == end || - it_component == end || it_release == end || - it_executable == end) - { - return false; - } - - if (it_analyzer->second[CD_CONTENT] == "" || it_mwuid->second[CD_CONTENT] == "" || - it_mwuuid->second[CD_CONTENT] == "" || it_package->second[CD_CONTENT] == "" || - it_architecture->second[CD_CONTENT] == "" || it_kernel->second[CD_CONTENT] == "" || - it_component->second[CD_CONTENT] == "" || it_release->second[CD_CONTENT] == "" || - it_executable->second[CD_CONTENT] == "") - { - return false; - } - - return true; -} - -report_status_t Report(const map_crash_data_t& pCrashData, +// We must not trust client_report here! +// dbus handler passes it from user without checking +report_status_t Report(const map_crash_data_t& client_report, map_map_string_t& pSettings, const char *pUID) { - report_status_t ret; - - /* dbus handler passes pCrashData from user without checking it */ + map_crash_data_t::const_iterator itc_end = client_report.end(); - if (!CheckReport(pCrashData)) - { - throw CABRTException(EXCEP_ERROR, "Report(): Some of mandatory report data are missing."); + // Get ID fields + map_crash_data_t::const_iterator itc_UID = client_report.find(FILENAME_UID); + map_crash_data_t::const_iterator itc_UUID = client_report.find(CD_UUID); + if (itc_UID == itc_end /* || !exists itc_UID->second[CD_CONTENT] (TODO) */ + || itc_UUID == itc_end + ) { + throw CABRTException(EXCEP_ERROR, "Report(): UID or UUID is missing in client's report data"); } - const std::string& analyzer = get_crash_data_item_content(pCrashData, CD_MWANALYZER); - const std::string& UID = get_crash_data_item_content(pCrashData, CD_MWUID); - const std::string& UUID = get_crash_data_item_content(pCrashData, CD_MWUUID); - const std::string& packageNVR = get_crash_data_item_content(pCrashData, FILENAME_PACKAGE); - std::string packageName = packageNVR.substr(0, packageNVR.rfind("-", packageNVR.rfind("-") - 1)); + // Retrieve corresponding stored record + std::string UID = itc_UID->second[CD_CONTENT]; + std::string UUID = itc_UUID->second[CD_CONTENT]; + + map_crash_data_t stored_report; + mw_result_t r = FillCrashInfo(UUID.c_str(), UID.c_str(), stored_report); + if (r != MW_OK) + return report_status_t(); + const std::string& pDumpDir = get_crash_data_item_content(stored_report, CD_DUMPDIR); // Save comment and "how to reproduce" - map_crash_data_t::const_iterator it_comment = pCrashData.find(CD_COMMENT); - map_crash_data_t::const_iterator it_reproduce = pCrashData.find(CD_REPRODUCE); - if (it_comment != pCrashData.end() || it_reproduce != pCrashData.end()) + map_crash_data_t::const_iterator itc_COMMENT = client_report.find(FILENAME_COMMENT); + map_crash_data_t::const_iterator itc_REPRODUCE = client_report.find(FILENAME_REPRODUCE); + if (itc_COMMENT != itc_end || itc_REPRODUCE != itc_end) { - std::string pDumpDir = getDebugDumpDir(UUID.c_str(), UID.c_str()); CDebugDump dd; dd.Open(pDumpDir.c_str()); - if (it_comment != pCrashData.end()) + if (itc_COMMENT != itc_end && itc_COMMENT->second.size() > CD_CONTENT) { - dd.SaveText(FILENAME_COMMENT, it_comment->second[CD_CONTENT].c_str()); + const char *comment = itc_COMMENT->second[CD_CONTENT].c_str(); + dd.SaveText(FILENAME_COMMENT, comment); + add_to_crash_data_ext(stored_report, FILENAME_COMMENT, CD_TXT, CD_ISEDITABLE, comment); } - if (it_reproduce != pCrashData.end()) + if (itc_REPRODUCE != itc_end && itc_REPRODUCE->second.size() > CD_CONTENT) { - dd.SaveText(FILENAME_REPRODUCE, it_reproduce->second[CD_CONTENT].c_str()); + const char *reproduce = itc_REPRODUCE->second[CD_CONTENT].c_str(); + dd.SaveText(FILENAME_REPRODUCE, reproduce); + add_to_crash_data_ext(stored_report, FILENAME_REPRODUCE, CD_TXT, CD_ISEDITABLE, reproduce); } } + map_crash_data_t::const_iterator its_ANALYZER = stored_report.find(FILENAME_ANALYZER); + std::string analyzer = its_ANALYZER->second[CD_CONTENT]; + + std::string gUUID = GetGlobalUUID(analyzer.c_str(), pDumpDir.c_str()); + VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str()); + add_to_crash_data_ext(stored_report, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str()); + + // Run reporters + + VERB3 { + log("Run reporters"); + log_map_crash_data(client_report, " client_report"); + log_map_crash_data(stored_report, " stored_report"); + } +#define client_report client_report_must_not_be_used_below + + map_crash_data_t::const_iterator its_PACKAGE = stored_report.find(FILENAME_PACKAGE); + std::string packageNVR = its_PACKAGE->second[CD_CONTENT]; + std::string packageName = packageNVR.substr(0, packageNVR.rfind("-", packageNVR.rfind("-") - 1)); + // analyzer with package name (CCpp:xorg-x11-app) has higher priority std::string key = analyzer + ":" + packageName; map_analyzer_actions_and_reporters_t::iterator end = s_mapAnalyzerActionsAndReporters.end(); @@ -484,6 +446,7 @@ report_status_t Report(const map_crash_data_t& pCrashData, key = analyzer; } + report_status_t ret; std::string message; if (keyPtr != end) { @@ -518,7 +481,7 @@ report_status_t Report(const map_crash_data_t& pCrashData, } #endif map_plugin_settings_t plugin_settings = pSettings[plugin_name]; - std::string res = reporter->Report(pCrashData, plugin_settings, it_r->second.c_str()); + std::string res = reporter->Report(stored_report, plugin_settings, it_r->second.c_str()); #if 0 /* Using ~user/.abrt/ is bad wrt security */ if (home != "") @@ -548,6 +511,7 @@ report_status_t Report(const map_crash_data_t& pCrashData, database->DisConnect(); return ret; +#undef client_report } /** @@ -935,10 +899,7 @@ mw_result_t FillCrashInfo(const char *pUUID, { CDebugDump dd; dd.Open(row.m_sDebugDumpDir.c_str()); - dd.LoadText(FILENAME_EXECUTABLE, executable); - dd.LoadText(FILENAME_PACKAGE, package); - dd.LoadText(FILENAME_DESCRIPTION, description); - dd.LoadText(FILENAME_ANALYZER, analyzer); + load_crash_data_from_debug_dump(dd, pCrashData); } catch (CABRTException& e) { @@ -946,18 +907,14 @@ mw_result_t FillCrashInfo(const char *pUUID, return MW_ERROR; } - pCrashData.clear(); - add_to_crash_data(pCrashData, CD_EXECUTABLE , executable.c_str() ); - add_to_crash_data(pCrashData, CD_PACKAGE , package.c_str() ); - add_to_crash_data(pCrashData, CD_DESCRIPTION, description.c_str() ); - add_to_crash_data(pCrashData, CD_UUID , row.m_sUUID.c_str() ); - add_to_crash_data(pCrashData, CD_UID , row.m_sUID.c_str() ); - add_to_crash_data(pCrashData, CD_COUNT , row.m_sCount.c_str() ); - add_to_crash_data(pCrashData, CD_TIME , row.m_sTime.c_str() ); - add_to_crash_data(pCrashData, CD_REPORTED , row.m_sReported.c_str() ); - add_to_crash_data(pCrashData, CD_MESSAGE , row.m_sMessage.c_str() ); - add_to_crash_data(pCrashData, CD_MWDDD , row.m_sDebugDumpDir.c_str()); - add_to_crash_data(pCrashData, CD_MWANALYZER , analyzer.c_str() ); + add_to_crash_data(pCrashData, CD_UUID , row.m_sUUID.c_str() ); + add_to_crash_data(pCrashData, CD_COUNT , row.m_sCount.c_str() ); + add_to_crash_data(pCrashData, CD_REPORTED , row.m_sReported.c_str() ); + add_to_crash_data(pCrashData, CD_MESSAGE , row.m_sMessage.c_str() ); + add_to_crash_data(pCrashData, CD_DUMPDIR , row.m_sDebugDumpDir.c_str()); +//TODO: why do we keep uid and time in DB and in dumpdir?! + add_to_crash_data(pCrashData, FILENAME_UID , row.m_sUID.c_str() ); + add_to_crash_data(pCrashData, FILENAME_TIME , row.m_sTime.c_str() ); return MW_OK; } -- cgit From c355df4b6d90f747bbd527c09b199e0825480fb6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 21 Jan 2010 13:00:52 +0100 Subject: restore saving of backtrace broken by client->server security fix Signed-off-by: Denys Vlasenko --- src/Daemon/MiddleWare.cpp | 81 +++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 45 deletions(-) (limited to 'src/Daemon/MiddleWare.cpp') diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index ecf3c13..9abb737 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -259,36 +259,31 @@ mw_result_t CreateCrashReport(const char *pUUID, mw_result_t r = MW_OK; try { - CDebugDump dd; - std::string analyzer; - std::string comment; - std::string reproduce = "1.\n2.\n3.\n"; - - VERB3 log(" LoadText(FILENAME_ANALYZER,'%s')", row.m_sDebugDumpDir.c_str()); - dd.Open(row.m_sDebugDumpDir.c_str()); - dd.LoadText(FILENAME_ANALYZER, analyzer); - if (dd.Exist(FILENAME_COMMENT)) { - dd.LoadText(FILENAME_COMMENT, comment); + CDebugDump dd; + dd.Open(row.m_sDebugDumpDir.c_str()); + load_crash_data_from_debug_dump(dd, pCrashData); } - if (dd.Exist(FILENAME_REPRODUCE)) - { - dd.LoadText(FILENAME_REPRODUCE, reproduce); - } - load_crash_data_from_debug_dump(dd, pCrashData); - dd.Close(); - VERB3 log(" CreateReport('%s')", analyzer.c_str()); + std::string analyzer = get_crash_data_item_content(pCrashData, FILENAME_ANALYZER); + + // TODO: explain what run_analyser_CreateReport and RunAnalyzerActions are expected to do. + // Do they potentially add more files to dump dir? + // Why we calculate dup_hash after run_analyser_CreateReport but before RunAnalyzerActions? + // Why do we reload dump dir's data via DebugDumpToCrashReport? + + VERB3 log(" run_analyser_CreateReport('%s')", analyzer.c_str()); run_analyser_CreateReport(analyzer.c_str(), row.m_sDebugDumpDir.c_str(), force); - std::string gUUID = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); - VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str()); + std::string dup_hash = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); + VERB3 log(" DUPHASH:'%s'", dup_hash.c_str()); VERB3 log(" RunAnalyzerActions('%s','%s')", analyzer.c_str(), row.m_sDebugDumpDir.c_str()); RunAnalyzerActions(analyzer.c_str(), row.m_sDebugDumpDir.c_str()); + DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashData); - add_to_crash_data_ext(pCrashData, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str()); + add_to_crash_data_ext(pCrashData, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, dup_hash.c_str()); add_to_crash_data_ext(pCrashData, CD_UUID , CD_SYS, CD_ISNOTEDITABLE, pUUID); } catch (CABRTException& e) @@ -373,54 +368,50 @@ report_status_t Report(const map_crash_data_t& client_report, map_map_string_t& pSettings, const char *pUID) { - map_crash_data_t::const_iterator itc_end = client_report.end(); - // Get ID fields - map_crash_data_t::const_iterator itc_UID = client_report.find(FILENAME_UID); - map_crash_data_t::const_iterator itc_UUID = client_report.find(CD_UUID); - if (itc_UID == itc_end /* || !exists itc_UID->second[CD_CONTENT] (TODO) */ - || itc_UUID == itc_end - ) { + const char *UID = get_crash_data_item_content_or_NULL(client_report, FILENAME_UID); + const char *UUID = get_crash_data_item_content_or_NULL(client_report, CD_UUID); + if (!UID || !UUID) { throw CABRTException(EXCEP_ERROR, "Report(): UID or UUID is missing in client's report data"); } // Retrieve corresponding stored record - std::string UID = itc_UID->second[CD_CONTENT]; - std::string UUID = itc_UUID->second[CD_CONTENT]; - map_crash_data_t stored_report; - mw_result_t r = FillCrashInfo(UUID.c_str(), UID.c_str(), stored_report); + mw_result_t r = FillCrashInfo(UUID, UID, stored_report); if (r != MW_OK) return report_status_t(); const std::string& pDumpDir = get_crash_data_item_content(stored_report, CD_DUMPDIR); - // Save comment and "how to reproduce" - map_crash_data_t::const_iterator itc_COMMENT = client_report.find(FILENAME_COMMENT); - map_crash_data_t::const_iterator itc_REPRODUCE = client_report.find(FILENAME_REPRODUCE); - if (itc_COMMENT != itc_end || itc_REPRODUCE != itc_end) + // Save comment, "how to reproduce", backtrace + const char *comment = get_crash_data_item_content_or_NULL(client_report, FILENAME_COMMENT); + const char *reproduce = get_crash_data_item_content_or_NULL(client_report, FILENAME_REPRODUCE); + const char *backtrace = get_crash_data_item_content_or_NULL(client_report, FILENAME_BACKTRACE); + if (comment || reproduce || backtrace) { CDebugDump dd; dd.Open(pDumpDir.c_str()); - if (itc_COMMENT != itc_end && itc_COMMENT->second.size() > CD_CONTENT) + if (comment) { - const char *comment = itc_COMMENT->second[CD_CONTENT].c_str(); dd.SaveText(FILENAME_COMMENT, comment); add_to_crash_data_ext(stored_report, FILENAME_COMMENT, CD_TXT, CD_ISEDITABLE, comment); } - if (itc_REPRODUCE != itc_end && itc_REPRODUCE->second.size() > CD_CONTENT) + if (reproduce) { - const char *reproduce = itc_REPRODUCE->second[CD_CONTENT].c_str(); dd.SaveText(FILENAME_REPRODUCE, reproduce); add_to_crash_data_ext(stored_report, FILENAME_REPRODUCE, CD_TXT, CD_ISEDITABLE, reproduce); } + if (backtrace) + { + dd.SaveText(FILENAME_BACKTRACE, backtrace); + add_to_crash_data_ext(stored_report, FILENAME_BACKTRACE, CD_TXT, CD_ISEDITABLE, backtrace); + } } - map_crash_data_t::const_iterator its_ANALYZER = stored_report.find(FILENAME_ANALYZER); - std::string analyzer = its_ANALYZER->second[CD_CONTENT]; + const std::string& analyzer = get_crash_data_item_content(stored_report, FILENAME_ANALYZER); - std::string gUUID = GetGlobalUUID(analyzer.c_str(), pDumpDir.c_str()); - VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str()); - add_to_crash_data_ext(stored_report, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str()); + std::string dup_hash = GetGlobalUUID(analyzer.c_str(), pDumpDir.c_str()); + VERB3 log(" DUPHASH:'%s'", dup_hash.c_str()); + add_to_crash_data_ext(stored_report, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, dup_hash.c_str()); // Run reporters @@ -507,7 +498,7 @@ report_status_t Report(const map_crash_data_t& client_report, CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database->SetReported(UUID.c_str(), UID.c_str(), message.c_str()); + database->SetReported(UUID, UID, message.c_str()); database->DisConnect(); return ret; -- cgit