cli: config: do not overwrite symlinks when saving config file

Use realpath to canonicalize the config path before writing.

Previously 'notmuch setup' and 'notmuch config set' overwrote the
config file even if it was a symbolic link.
This commit is contained in:
Jani Nikula 2013-04-07 20:15:03 +03:00 committed by David Bremner
parent 7defbcdcec
commit 58ed67992d
2 changed files with 21 additions and 6 deletions

View file

@ -444,7 +444,7 @@ int
notmuch_config_save (notmuch_config_t *config) notmuch_config_save (notmuch_config_t *config)
{ {
size_t length; size_t length;
char *data; char *data, *filename;
GError *error = NULL; GError *error = NULL;
data = g_key_file_to_data (config->key_file, &length, NULL); data = g_key_file_to_data (config->key_file, &length, NULL);
@ -453,14 +453,30 @@ notmuch_config_save (notmuch_config_t *config)
return 1; return 1;
} }
if (! g_file_set_contents (config->filename, data, length, &error)) { /* Try not to overwrite symlinks. */
fprintf (stderr, "Error saving configuration to %s: %s\n", filename = realpath (config->filename, NULL);
config->filename, error->message); if (! filename) {
g_error_free (error); fprintf (stderr, "Error canonicalizing %s: %s\n", config->filename,
strerror (errno));
g_free (data); g_free (data);
return 1; return 1;
} }
if (! g_file_set_contents (filename, data, length, &error)) {
if (strcmp (filename, config->filename) != 0) {
fprintf (stderr, "Error saving configuration to %s (-> %s): %s\n",
config->filename, filename, error->message);
} else {
fprintf (stderr, "Error saving configuration to %s: %s\n",
filename, error->message);
}
g_error_free (error);
free (filename);
g_free (data);
return 1;
}
free (filename);
g_free (data); g_free (data);
return 0; return 0;
} }

View file

@ -78,7 +78,6 @@ test_expect_equal "$(notmuch --config=alt-config-link config get user.name)" \
"Link Name" "Link Name"
test_begin_subtest "Writing config file through symlink follows symlink" test_begin_subtest "Writing config file through symlink follows symlink"
test_subtest_known_broken
test_expect_equal "$(readlink alt-config-link)" "alt-config" test_expect_equal "$(readlink alt-config-link)" "alt-config"
test_done test_done