Blob Blame Raw
From 2d29ecb0067dad7f5abf7b469dde84484b1a79ed Mon Sep 17 00:00:00 2001
From: Jakub Filak <jfilak@redhat.com>
Date: Wed, 27 Aug 2014 08:45:24 +0200
Subject: [PATCH] a-a-s-p-data: reduce amount of error messages

Read each GPG key only once. The GPG key dirs may contain many symlinks
and if their target cannot be read, then we print an error message for
every symlink pointing to the unreadable file. What's worse, the error
messages show a path to the target, so users see several identical
messages in the system logs.

Related to rhbz#1133674

Signed-off-by: Jakub Filak <jfilak@redhat.com>
---
 src/daemon/abrt-action-save-package-data.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/daemon/abrt-action-save-package-data.c b/src/daemon/abrt-action-save-package-data.c
index 6dbcfc2..cc86327 100644
--- a/src/daemon/abrt-action-save-package-data.c
+++ b/src/daemon/abrt-action-save-package-data.c
@@ -91,16 +91,22 @@ static void load_gpg_keys(void)
     if (strcmp(gpg_keys_dir, "") != 0)
     {
         log_debug("Reading gpg keys from '%s'", gpg_keys_dir);
+        GHashTable *done_set = g_hash_table_new(g_str_hash, g_str_equal);
         GList *gpg_files = get_file_list(gpg_keys_dir, NULL /* we don't care about the file ext */);
-        GList *tmp_gpp_files = gpg_files;
-        while (tmp_gpp_files)
+        for (GList *iter = gpg_files; iter; iter = g_list_next(iter))
         {
-            log_debug("Loading gpg key '%s'", fo_get_fullpath((file_obj_t *)tmp_gpp_files->data));
-            settings_setOpenGPGPublicKeys = g_list_append(settings_setOpenGPGPublicKeys, xstrdup(fo_get_fullpath((file_obj_t *)(tmp_gpp_files->data)) ));
-            tmp_gpp_files = g_list_next(tmp_gpp_files);
+            const char *key_path = fo_get_fullpath((file_obj_t *)iter->data);
+
+            if (g_hash_table_contains(done_set, key_path))
+                continue;
+
+            g_hash_table_insert(done_set, (gpointer)key_path, NULL);
+            log_debug("Loading gpg key '%s'", key_path);
+            settings_setOpenGPGPublicKeys = g_list_append(settings_setOpenGPGPublicKeys, xstrdup(key_path));
         }
 
         g_list_free_full(gpg_files, (GDestroyNotify)free_file_obj);
+        g_hash_table_destroy(done_set);
     }
 }
 
-- 
1.9.3