mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-22 17:34:54 +01:00
Avoid segmentation fault with NOTMUCH_CONFIG=/new/config/file notmuch setup
Since commit f41a35e292
running a command
such as:
NOTMUCH_CONFIG=/new/config/file notmuch setup
would result in a segmentation fault.
The purpose of that commit was to ensure that an attempt to manipulate
a non-standard database would not inadvertently manipulate the default
database only due to a typo in the NOTMUCH_CONFIG environment
variable. That is, a command like:
NOTMUCH_CONFIG=mistyped-config-filename notmuch tag -new tag:new
shouldn't modify the database at ${HOME}/mail, but should instead
simply report that the mistype configuration filename does not exist.
We fix both cases simultaneously by reporting the error message
whenever the function calling notmuch_config_open is not explicitly
prepared for a default configuration file.
This commit is contained in:
parent
6607fd65b1
commit
676d25111e
1 changed files with 33 additions and 24 deletions
|
@ -151,26 +151,33 @@ get_username_from_passwd_file (void *ctx)
|
||||||
* etc.), this function will print a message to stderr and return
|
* etc.), this function will print a message to stderr and return
|
||||||
* NULL.
|
* NULL.
|
||||||
*
|
*
|
||||||
* Note: It is *not* an error if the specified configuration file does
|
* FILE NOT FOUND: When the specified configuration file (whether from
|
||||||
* not exist. In this case, a default configuration will be created
|
* 'filename' or the $NOTMUCH_CONFIG environment variable) does not
|
||||||
* and returned. Subsequently calling notmuch_config_save will cause
|
* exist, the behavior of this function depends on the 'is_new_ret'
|
||||||
* the configuration to be written to the filename specified at the
|
* variable.
|
||||||
* time of notmuch_config_open.
|
|
||||||
*
|
*
|
||||||
* The default configuration settings are determined as follows:
|
* If is_new_ret is NULL, then a "file not found" message will be
|
||||||
|
* printed to stderr and NULL will be returned.
|
||||||
|
|
||||||
|
* If is_new_ret is non-NULL then a default configuration will be
|
||||||
|
* returned and *is_new_ret will be set to 1 on return so that
|
||||||
|
* the caller can recognize this case.
|
||||||
*
|
*
|
||||||
* database_path: $HOME/mail
|
* These default configuration settings are determined as
|
||||||
|
* follows:
|
||||||
*
|
*
|
||||||
* user_name: From /etc/passwd
|
* database_path: $HOME/mail
|
||||||
*
|
*
|
||||||
* user_primary_mail: $EMAIL variable if set, otherwise
|
* user_name: From /etc/passwd
|
||||||
* constructed from the username and
|
|
||||||
* hostname of the current machine.
|
|
||||||
*
|
*
|
||||||
* user_other_email: Not set.
|
* user_primary_mail: $EMAIL variable if set, otherwise
|
||||||
|
* constructed from the username and
|
||||||
|
* hostname of the current machine.
|
||||||
*
|
*
|
||||||
* The default configuration also contains comments to guide the user
|
* user_other_email: Not set.
|
||||||
* in editing the file directly.
|
*
|
||||||
|
* The default configuration also contains comments to guide the
|
||||||
|
* user in editing the file directly.
|
||||||
*/
|
*/
|
||||||
notmuch_config_t *
|
notmuch_config_t *
|
||||||
notmuch_config_open (void *ctx,
|
notmuch_config_open (void *ctx,
|
||||||
|
@ -220,14 +227,19 @@ notmuch_config_open (void *ctx,
|
||||||
G_KEY_FILE_KEEP_COMMENTS,
|
G_KEY_FILE_KEEP_COMMENTS,
|
||||||
&error))
|
&error))
|
||||||
{
|
{
|
||||||
/* We are capable of dealing with a non-existent configuration
|
/* If the caller passed a non-NULL value for is_new_ret, then
|
||||||
* file, so be silent about that (unless the user had set a
|
* the caller is prepared for a default configuration file in
|
||||||
* non-default configuration file with the NOTMUCH_CONFIG
|
* the case of FILE NOT FOUND. Otherwise, any read failure is
|
||||||
* variable)
|
* an error.
|
||||||
*/
|
*/
|
||||||
if (notmuch_config_env ||
|
if (is_new_ret &&
|
||||||
!(error->domain == G_FILE_ERROR &&
|
error->domain == G_FILE_ERROR &&
|
||||||
error->code == G_FILE_ERROR_NOENT))
|
error->code == G_FILE_ERROR_NOENT)
|
||||||
|
{
|
||||||
|
g_error_free (error);
|
||||||
|
is_new = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Error reading configuration file %s: %s\n",
|
fprintf (stderr, "Error reading configuration file %s: %s\n",
|
||||||
config->filename, error->message);
|
config->filename, error->message);
|
||||||
|
@ -235,9 +247,6 @@ notmuch_config_open (void *ctx,
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_error_free (error);
|
|
||||||
is_new = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Whenever we know of configuration sections that don't appear in
|
/* Whenever we know of configuration sections that don't appear in
|
||||||
|
|
Loading…
Reference in a new issue