|
Jakub Filak |
2164d6 |
From 0a0f129a6622fd7099de8cec6a1d95a4189a91d1 Mon Sep 17 00:00:00 2001
|
|
Jakub Filak |
2164d6 |
From: Jakub Filak <jfilak@redhat.com>
|
|
Jakub Filak |
2164d6 |
Date: Tue, 21 Oct 2014 14:57:10 +0200
|
|
Jakub Filak |
2164d6 |
Subject: [PATCH] applet: ensure writable dump directory before reporting
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
Related to rhbz#1084027
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
Signed-off-by: Jakub Filak <jfilak@redhat.com>
|
|
Jakub Filak |
2164d6 |
---
|
|
Jakub Filak |
2164d6 |
src/applet/applet.c | 62 ++++++++++++++++++++++++++++++++++-------------------
|
|
Jakub Filak |
2164d6 |
1 file changed, 40 insertions(+), 22 deletions(-)
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
diff --git a/src/applet/applet.c b/src/applet/applet.c
|
|
Jakub Filak |
2164d6 |
index 90c5b0d..644da60 100644
|
|
Jakub Filak |
2164d6 |
--- a/src/applet/applet.c
|
|
Jakub Filak |
2164d6 |
+++ b/src/applet/applet.c
|
|
Jakub Filak |
2164d6 |
@@ -307,6 +307,7 @@ typedef struct problem_info {
|
|
Jakub Filak |
2164d6 |
bool incomplete;
|
|
Jakub Filak |
2164d6 |
bool reported;
|
|
Jakub Filak |
2164d6 |
bool was_announced;
|
|
Jakub Filak |
2164d6 |
+ bool is_writable;
|
|
Jakub Filak |
2164d6 |
} problem_info_t;
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
static void push_to_deferred_queue(problem_info_t *pi)
|
|
Jakub Filak |
2164d6 |
@@ -324,6 +325,36 @@ static void problem_info_set_dir(problem_info_t *pi, const char *dir)
|
|
Jakub Filak |
2164d6 |
problem_data_add_text_noteditable(pi->problem_data, CD_DUMPDIR, dir);
|
|
Jakub Filak |
2164d6 |
}
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
+static bool problem_info_ensure_writable(problem_info_t *pi)
|
|
Jakub Filak |
2164d6 |
+{
|
|
Jakub Filak |
2164d6 |
+ if (pi->is_writable)
|
|
Jakub Filak |
2164d6 |
+ return true;
|
|
Jakub Filak |
2164d6 |
+
|
|
Jakub Filak |
2164d6 |
+ /* chown the directory in any case, because kernel oopses are not foreign */
|
|
Jakub Filak |
2164d6 |
+ /* but their dump directories are not writable without chowning them or */
|
|
Jakub Filak |
2164d6 |
+ /* stealing them. The stealing is deprecated as it breaks the local */
|
|
Jakub Filak |
2164d6 |
+ /* duplicate search and root cannot see them */
|
|
Jakub Filak |
2164d6 |
+ const int res = chown_dir_over_dbus(problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
+ if (pi->foreign && res != 0)
|
|
Jakub Filak |
2164d6 |
+ {
|
|
Jakub Filak |
2164d6 |
+ error_msg(_("Can't take ownership of '%s'"), problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
+ return false;
|
|
Jakub Filak |
2164d6 |
+ }
|
|
Jakub Filak |
2164d6 |
+ pi->foreign = false;
|
|
Jakub Filak |
2164d6 |
+
|
|
Jakub Filak |
2164d6 |
+ struct dump_dir *dd = open_directory_for_writing(problem_info_get_dir(pi), /* don't ask */ NULL);
|
|
Jakub Filak |
2164d6 |
+ if (!dd)
|
|
Jakub Filak |
2164d6 |
+ {
|
|
Jakub Filak |
2164d6 |
+ error_msg(_("Can't open directory for writing '%s'"), problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
+ return false;
|
|
Jakub Filak |
2164d6 |
+ }
|
|
Jakub Filak |
2164d6 |
+
|
|
Jakub Filak |
2164d6 |
+ problem_info_set_dir(pi, dd->dd_dirname);
|
|
Jakub Filak |
2164d6 |
+ pi->is_writable = true;
|
|
Jakub Filak |
2164d6 |
+ dd_close(dd);
|
|
Jakub Filak |
2164d6 |
+ return true;
|
|
Jakub Filak |
2164d6 |
+}
|
|
Jakub Filak |
2164d6 |
+
|
|
Jakub Filak |
2164d6 |
static problem_info_t *problem_info_new(const char *dir)
|
|
Jakub Filak |
2164d6 |
{
|
|
Jakub Filak |
2164d6 |
problem_info_t *pi = xzalloc(sizeof(*pi));
|
|
Jakub Filak |
2164d6 |
@@ -610,8 +641,13 @@ static pid_t spawn_event_handler_child(const char *dump_dir_name, const char *ev
|
|
Jakub Filak |
2164d6 |
return child;
|
|
Jakub Filak |
2164d6 |
}
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
-static void run_report_from_applet(const char *dirname)
|
|
Jakub Filak |
2164d6 |
+static void run_report_from_applet(problem_info_t *pi)
|
|
Jakub Filak |
2164d6 |
{
|
|
Jakub Filak |
2164d6 |
+ if (!problem_info_ensure_writable(pi))
|
|
Jakub Filak |
2164d6 |
+ return;
|
|
Jakub Filak |
2164d6 |
+
|
|
Jakub Filak |
2164d6 |
+ const char *dirname = problem_info_get_dir(pi);
|
|
Jakub Filak |
2164d6 |
+
|
|
Jakub Filak |
2164d6 |
fflush(NULL); /* paranoia */
|
|
Jakub Filak |
2164d6 |
pid_t pid = fork();
|
|
Jakub Filak |
2164d6 |
if (pid < 0)
|
|
Jakub Filak |
2164d6 |
@@ -649,7 +685,7 @@ static void action_report(NotifyNotification *notification, gchar *action, gpoin
|
|
Jakub Filak |
2164d6 |
{
|
|
Jakub Filak |
2164d6 |
if (strcmp(A_REPORT_REPORT, action) == 0)
|
|
Jakub Filak |
2164d6 |
{
|
|
Jakub Filak |
2164d6 |
- run_report_from_applet(problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
+ run_report_from_applet(pi);
|
|
Jakub Filak |
2164d6 |
problem_info_free(pi);
|
|
Jakub Filak |
2164d6 |
}
|
|
Jakub Filak |
2164d6 |
else
|
|
Jakub Filak |
2164d6 |
@@ -1118,7 +1154,7 @@ static gboolean handle_event_output_cb(GIOChannel *gio, GIOCondition condition,
|
|
Jakub Filak |
2164d6 |
if (pi->known || !(state->flags & REPORT_UNKNOWN_PROBLEM_IMMEDIATELY))
|
|
Jakub Filak |
2164d6 |
notify_problem(pi);
|
|
Jakub Filak |
2164d6 |
else
|
|
Jakub Filak |
2164d6 |
- run_report_from_applet(problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
+ run_report_from_applet(pi);
|
|
Jakub Filak |
2164d6 |
}
|
|
Jakub Filak |
2164d6 |
else
|
|
Jakub Filak |
2164d6 |
{
|
|
Jakub Filak |
2164d6 |
@@ -1179,29 +1215,11 @@ static void export_event_configuration(const char *event_name)
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
static void run_event_async(problem_info_t *pi, const char *event_name, int flags)
|
|
Jakub Filak |
2164d6 |
{
|
|
Jakub Filak |
2164d6 |
- /* chown the directory in any case, because kernel oopses are not foreign */
|
|
Jakub Filak |
2164d6 |
- /* but their dump directories are not writable without chowning them or */
|
|
Jakub Filak |
2164d6 |
- /* stealing them. The stealing is deprecated as it breaks the local */
|
|
Jakub Filak |
2164d6 |
- /* duplicate search and root cannot see them */
|
|
Jakub Filak |
2164d6 |
- const int res = chown_dir_over_dbus(problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
- if (pi->foreign && res != 0)
|
|
Jakub Filak |
2164d6 |
+ if (!problem_info_ensure_writable(pi))
|
|
Jakub Filak |
2164d6 |
{
|
|
Jakub Filak |
2164d6 |
- error_msg(_("Can't take ownership of '%s'"), problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
problem_info_free(pi);
|
|
Jakub Filak |
2164d6 |
return;
|
|
Jakub Filak |
2164d6 |
}
|
|
Jakub Filak |
2164d6 |
- pi->foreign = false;
|
|
Jakub Filak |
2164d6 |
-
|
|
Jakub Filak |
2164d6 |
- struct dump_dir *dd = open_directory_for_writing(problem_info_get_dir(pi), /* don't ask */ NULL);
|
|
Jakub Filak |
2164d6 |
- if (!dd)
|
|
Jakub Filak |
2164d6 |
- {
|
|
Jakub Filak |
2164d6 |
- error_msg(_("Can't open directory for writing '%s'"), problem_info_get_dir(pi));
|
|
Jakub Filak |
2164d6 |
- problem_info_free(pi);
|
|
Jakub Filak |
2164d6 |
- return;
|
|
Jakub Filak |
2164d6 |
- }
|
|
Jakub Filak |
2164d6 |
-
|
|
Jakub Filak |
2164d6 |
- problem_info_set_dir(pi, dd->dd_dirname);
|
|
Jakub Filak |
2164d6 |
- dd_close(dd);
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
export_event_configuration(event_name);
|
|
Jakub Filak |
2164d6 |
|
|
Jakub Filak |
2164d6 |
--
|
|
Jakub Filak |
2164d6 |
2.1.0
|
|
Jakub Filak |
2164d6 |
|