mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-22 02:48:08 +01:00
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:
parent
7defbcdcec
commit
58ed67992d
2 changed files with 21 additions and 6 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue