diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-03 17:43:18 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-03 17:43:18 +0100 |
commit | a756114f9d29983d9505309efb3b6f0ed09f946f (patch) | |
tree | e86f75e53b1b910dc691d2aff11fc278821dfe7b /src/Daemon | |
parent | 3bd822eac9229ac124fec89f7aa926cc7220972c (diff) | |
download | abrt-a756114f9d29983d9505309efb3b6f0ed09f946f.tar.gz abrt-a756114f9d29983d9505309efb3b6f0ed09f946f.tar.xz abrt-a756114f9d29983d9505309efb3b6f0ed09f946f.zip |
hopefully fix rhbz#541854: when we trim the dir, we must delete it from DB too
Also added a more robust code to resis SEGVing if directory doesn't exist.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'src/Daemon')
-rw-r--r-- | src/Daemon/CrashWatcher.cpp | 29 | ||||
-rw-r--r-- | src/Daemon/CrashWatcher.h | 3 | ||||
-rw-r--r-- | src/Daemon/Daemon.cpp | 3 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.cpp | 63 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.h | 13 |
5 files changed, 73 insertions, 38 deletions
diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index b82823c5..d9c3cb11 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -62,7 +62,7 @@ vector_crash_infos_t GetCrashInfos(const char *pUID) const char *uuid = UUIDsUIDs[ii].first.c_str(); const char *uid = UUIDsUIDs[ii].second.c_str(); - res = GetCrashInfo(uuid, uid, info); + res = FillCrashInfo(uuid, uid, info); switch (res) { case MW_OK: @@ -70,12 +70,12 @@ vector_crash_infos_t GetCrashInfos(const char *pUID) break; case MW_ERROR: error_msg("Can't find dump directory for UUID %s, deleting from database", uuid); - DeleteCrashInfo(uuid, uid); + DeleteCrashInfoInDB(uuid, uid); break; case MW_FILE_ERROR: error_msg("Can't open file in dump directory for UUID %s, deleting", uuid); { - std::string debugDumpDir = DeleteCrashInfo(uuid, uid); + std::string debugDumpDir = DeleteCrashInfoInDB(uuid, uid); delete_debug_dump_dir(debugDumpDir.c_str()); } break; @@ -132,7 +132,7 @@ map_crash_report_t GetJobResult(const char* pUUID, const char* pUID, int force) case MW_FILE_ERROR: default: error_msg("Corrupted crash with UUID %s, deleting", pUUID); - std::string debugDumpDir = DeleteCrashInfo(pUUID, pUID); + std::string debugDumpDir = DeleteCrashInfoInDB(pUUID, pUID); delete_debug_dump_dir(debugDumpDir.c_str()); break; } @@ -211,7 +211,7 @@ bool DeleteDebugDump(const char *pUUID, const char *pUID) { try { - std::string debugDumpDir = DeleteCrashInfo(pUUID, pUID); + std::string debugDumpDir = DeleteCrashInfoInDB(pUUID, pUID); delete_debug_dump_dir(debugDumpDir.c_str()); } catch (CABRTException& e) @@ -225,3 +225,22 @@ bool DeleteDebugDump(const char *pUUID, const char *pUID) } return true; } + +bool DeleteDebugDump_by_dir(const char *dump_dir) +{ + try + { + DeleteCrashInfosInDB_by_dir(dump_dir); + delete_debug_dump_dir(dump_dir); + } + catch (CABRTException& e) + { + if (e.type() == EXCEP_FATAL) + { + throw e; + } + error_msg("%s", e.what()); + return false; + } + return true; +} diff --git a/src/Daemon/CrashWatcher.h b/src/Daemon/CrashWatcher.h index 995d2a12..00814183 100644 --- a/src/Daemon/CrashWatcher.h +++ b/src/Daemon/CrashWatcher.h @@ -52,5 +52,6 @@ vector_crash_infos_t GetCrashInfos(const char *pUID); int CreateReportThread(const char* pUUID, const char* pUID, int force, const char* pSender); map_crash_report_t GetJobResult(const char* pUUID, const char* pUID, int force); bool DeleteDebugDump(const char *pUUID, const char *pUID); +bool DeleteDebugDump_by_dir(const char *dump_dir); -#endif /*CRASHWATCHER_H_*/ +#endif diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index c2d22656..4cfd0491 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -474,7 +474,8 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin ) { log("Size of '%s' >= %u MB, deleting '%s'", DEBUG_DUMPS_DIR, g_settings_nMaxCrashReportsSize, worst_dir.c_str()); g_pCommLayer->QuotaExceed(_("Report size exceeded the quota. Please check system's MaxCrashReportsSize value in abrt.conf.")); - delete_debug_dump_dir(concat_path_file(DEBUG_DUMPS_DIR, worst_dir.c_str()).c_str()); + /* deletes both directory and DB record */ + DeleteDebugDump_by_dir(concat_path_file(DEBUG_DUMPS_DIR, worst_dir.c_str()).c_str()); worst_dir = ""; } diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 94e27ae2..5f922e8d 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -247,7 +247,7 @@ mw_result_t CreateCrashReport(const char *pUUID, { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - row = database->GetUUIDData(pUUID, pUID); + row = database->GetRow(pUUID, pUID); database->DisConnect(); } if (pUUID[0] == '\0' || row.m_sUUID != pUUID) @@ -520,18 +520,26 @@ report_status_t Report(const map_crash_report_t& pCrashReport, return ret; } -std::string DeleteCrashInfo(const char *pUUID, - const char *pUID) +std::string DeleteCrashInfoInDB(const char *pUUID, + const char *pUID) { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database_row_t row = database->GetUUIDData(pUUID, pUID); - database->Delete(pUUID, pUID); + database_row_t row = database->GetRow(pUUID, pUID); + database->DeleteRow(pUUID, pUID); database->DisConnect(); return row.m_sDebugDumpDir; } +void DeleteCrashInfosInDB_by_dir(const char *dump_dir) +{ + CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); + database->Connect(); + database->DeleteRows_by_dir(dump_dir); + database->DisConnect(); +} + /** * Check whether particular debugdump directory is saved * in database. This check is done together with an UID of an user. @@ -746,26 +754,31 @@ static void RunAnalyzerActions(const char *pAnalyzer, const char *pDebugDumpDir) * @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) + const char *pUID, + const char *pTime, + const char *pDebugDumpDir, + map_crash_info_t& pCrashInfo) { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database->Insert(pUUID, pUID, pDebugDumpDir, pTime); - database_row_t row = database->GetUUIDData(pUUID, pUID); + /* note: if [UUID,UID] record exists, pDebugDumpDir is not updated in the record */ + database->Insert_or_Update(pUUID, pUID, pDebugDumpDir, pTime); + database_row_t row = database->GetRow(pUUID, pUID); database->DisConnect(); - mw_result_t res = GetCrashInfo(pUUID, pUID, pCrashInfo); - if (row.m_sReported == "1") - { - log("Crash is already reported"); - return MW_REPORTED; - } - if (row.m_sCount != "1") + + mw_result_t res = FillCrashInfo(pUUID, pUID, pCrashInfo); + if (res == MW_OK) { - log("Crash is in database already"); - return MW_OCCURED; + if (row.m_sReported == "1") + { + log("Crash is already reported"); + return MW_REPORTED; + } + if (row.m_sCount != "1") + { + log("Crash is in database already"); + return MW_OCCURED; + } } return res; } @@ -775,13 +788,13 @@ std::string getDebugDumpDir(const char *pUUID, { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database_row_t row = database->GetUUIDData(pUUID, pUID); + database_row_t row = database->GetRow(pUUID, pUID); database->DisConnect(); return row.m_sDebugDumpDir; } mw_result_t SaveDebugDump(const char *pDebugDumpDir, - map_crash_info_t& pCrashInfo) + map_crash_info_t& pCrashInfo) { std::string UID; std::string time; @@ -823,14 +836,13 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, return SaveDebugDumpToDatabase(lUUID.c_str(), uid_str, time.c_str(), pDebugDumpDir, pCrashInfo); } -mw_result_t GetCrashInfo(const char *pUUID, +mw_result_t FillCrashInfo(const char *pUUID, const char *pUID, map_crash_info_t& pCrashInfo) { - pCrashInfo.clear(); CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database_row_t row = database->GetUUIDData(pUUID, pUID); + database_row_t row = database->GetRow(pUUID, pUID); database->DisConnect(); std::string package; @@ -856,6 +868,7 @@ mw_result_t GetCrashInfo(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); diff --git a/src/Daemon/MiddleWare.h b/src/Daemon/MiddleWare.h index 3de287b3..44fa3b6b 100644 --- a/src/Daemon/MiddleWare.h +++ b/src/Daemon/MiddleWare.h @@ -112,8 +112,9 @@ std::string getDebugDumpDir( const char *pUUID, * @param pUID An UID of an user. * @return A debugdump directory. */ -std::string DeleteCrashInfo(const char *pUUID, - const char *pUID); +std::string DeleteCrashInfoInDB(const char *pUUID, + const char *pUID); +void DeleteCrashInfosInDB_by_dir(const char *dump_dir); /** * Saves debugdump into database. If saving is successful, * it fills crash info. @@ -122,7 +123,7 @@ std::string DeleteCrashInfo(const char *pUUID, * @return It return results of operation. See mw_result_t. */ mw_result_t SaveDebugDump(const char *pDebugDumpDir, - map_crash_info_t& pCrashInfo); + map_crash_info_t& pCrashInfo); /** * Get one crash info. If getting is successful, * then crash info is filled. @@ -131,9 +132,9 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, * @param pCrashInfo A crash info. * @return It return results of operation. See mw_result_t. */ -mw_result_t GetCrashInfo(const char *pUUID, - const char *pUID, - map_crash_info_t& pCrashInfo); +mw_result_t FillCrashInfo(const char *pUUID, + const char *pUID, + map_crash_info_t& pCrashInfo); /** * Gets all local UUIDs and UIDs of crashes. These crashes * occurred when a particular user was logged in. |