[PATCH] config: do not overwrite symlinks when saving config file

Subject: [PATCH] config: do not overwrite symlinks when saving config file

Date: Sat, 2 Mar 2013 23:24:02 +0200

To: notmuch@notmuchmail.org

Cc:

From: Jani Nikula


Use realpath on the config path before writing. If that fails,
fallback to the previous behaviour.

Previously 'notmuch setup' and 'notmuch config set' overwrote the
config file even if it was a symbolic link.
---
 notmuch-config.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/notmuch-config.c b/notmuch-config.c
index b5c2066..1e7389f 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -461,7 +461,7 @@ int
 notmuch_config_save (notmuch_config_t *config)
 {
     size_t length;
-    char *data;
+    char *data, *filename;
     GError *error = NULL;
 
     data = g_key_file_to_data (config->key_file, &length, NULL);
@@ -470,14 +470,20 @@ notmuch_config_save (notmuch_config_t *config)
 	return 1;
     }
 
-    if (! g_file_set_contents (config->filename, data, length, &error)) {
+    /* Try not to overwrite symlinks. */
+    filename = realpath (config->filename, NULL);
+
+    if (! g_file_set_contents (filename ? filename : config->filename,
+			       data, length, &error)) {
 	fprintf (stderr, "Error saving configuration to %s: %s\n",
 		 config->filename, error->message);
 	g_error_free (error);
+	free (filename);
 	g_free (data);
 	return 1;
     }
 
+    free (filename);
     g_free (data);
     return 0;
 }
-- 
1.7.10.4


Thread: