summaryrefslogtreecommitdiffstats
path: root/src/Daemon
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-12-03 17:43:18 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-12-03 17:43:18 +0100
commita756114f9d29983d9505309efb3b6f0ed09f946f (patch)
treee86f75e53b1b910dc691d2aff11fc278821dfe7b /src/Daemon
parent3bd822eac9229ac124fec89f7aa926cc7220972c (diff)
downloadabrt-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.cpp29
-rw-r--r--src/Daemon/CrashWatcher.h3
-rw-r--r--src/Daemon/Daemon.cpp3
-rw-r--r--src/Daemon/MiddleWare.cpp63
-rw-r--r--src/Daemon/MiddleWare.h13
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.