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