From: Junio C Hamano <gitster@pobox.com>
To: Tanay Abhra <tanayabh@gmail.com>
Subject: Re: [PATCH] config: add show_err flag to git_config_parse_key()
Date: Thu, 30 Oct 2014 11:21:09 -0700 [thread overview]
Message-ID: <xmqqd299wh9m.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <CAEc54XBOvqT234s0UX-osYbOJfyuPquWLtmzDNDhAQoJ8b9eXg@mail.gmail.com> (Tanay Abhra's message of "Thu, 30 Oct 2014 23:18:05 +0530")
Tanay Abhra <tanayabh@gmail.com> writes:
> `git_config_parse_key()` is used to sanitize the input key.
> Some callers of the function like `git_config_set_multivar_in_file()`
> get the pre-sanitized key directly from the user so it becomes
> necessary to raise an error specifying what went wrong when the entered
> key is defective.
>
> Other callers like `configset_find_element()` get their keys from
> the git itself so a return value signifying error would be enough.
> The error output shown to the user is useless and confusing in this
> case so add a show_err flag to suppress errors in such cases.
>
> Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
> ---
>
> Hi,
>
> You were right, one of the functions was calling git_config_parse_key()
> which was leaking errors to the console. git_config_parse_key() was
> meant for sanitizing user provided keys only but it was being used
> internally in a place where only a return value would be enough.
>
> Thanks for bringing this to our attention.
>
> Cheers,
> Tanay Abhra.
Who are *you* in the above, and what was the bug report about (if it
was a bug report)? Perhaps summarize it in a form of a few new tests
in t/t13XX series is in order?
Thanks.
>
> builtin/config.c | 2 +-
> cache.h | 2 +-
> config.c | 19 ++++++++++++-------
> 3 files changed, 14 insertions(+), 9 deletions(-)
>
> diff --git a/builtin/config.c b/builtin/config.c
> index 8cc2604..51635dc 100644
> --- a/builtin/config.c
> +++ b/builtin/config.c
> @@ -200,7 +200,7 @@ static int get_value(const char *key_, const char *regex_)
> goto free_strings;
> }
> } else {
> - if (git_config_parse_key(key_, &key, NULL)) {
> + if (git_config_parse_key(key_, &key, NULL, 1)) {
> ret = CONFIG_INVALID_KEY;
> goto free_strings;
> }
> diff --git a/cache.h b/cache.h
> index 99ed096..8129590 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -1362,7 +1362,7 @@ extern int git_config_string(const char **,
> const char *, const char *);
> extern int git_config_pathname(const char **, const char *, const char *);
> extern int git_config_set_in_file(const char *, const char *, const char *);
> extern int git_config_set(const char *, const char *);
> -extern int git_config_parse_key(const char *, char **, int *);
> +extern int git_config_parse_key(const char *, char **, int *, int);
> extern int git_config_set_multivar(const char *, const char *, const
> char *, int);
> extern int git_config_set_multivar_in_file(const char *, const char
> *, const char *, const char *, int);
> extern int git_config_rename_section(const char *, const char *);
> diff --git a/config.c b/config.c
> index 15a2983..eb9058c 100644
> --- a/config.c
> +++ b/config.c
> @@ -1299,7 +1299,7 @@ static struct config_set_element
> *configset_find_element(struct config_set *cs,
> * `key` may come from the user, so normalize it before using it
> * for querying entries from the hashmap.
> */
> - ret = git_config_parse_key(key, &normalized_key, NULL);
> + ret = git_config_parse_key(key, &normalized_key, NULL, 0);
>
> if (ret)
> return NULL;
> @@ -1832,8 +1832,9 @@ int git_config_set(const char *key, const char *value)
> * lowercase section and variable name
> * baselen - pointer to int which will hold the length of the
> * section + subsection part, can be NULL
> + * show_err - toggle whether the function raises an error on a defective key
> */
> -int git_config_parse_key(const char *key, char **store_key, int *baselen_)
> +int git_config_parse_key(const char *key, char **store_key, int
> *baselen_, int show_err)
> {
> int i, dot, baselen;
> const char *last_dot = strrchr(key, '.');
> @@ -1844,12 +1845,14 @@ int git_config_parse_key(const char *key, char
> **store_key, int *baselen_)
> */
>
> if (last_dot == NULL || last_dot == key) {
> - error("key does not contain a section: %s", key);
> + if (show_err)
> + error("key does not contain a section: %s", key);
> return -CONFIG_NO_SECTION_OR_NAME;
> }
>
> if (!last_dot[1]) {
> - error("key does not contain variable name: %s", key);
> + if (show_err)
> + error("key does not contain variable name: %s", key);
> return -CONFIG_NO_SECTION_OR_NAME;
> }
>
> @@ -1871,12 +1874,14 @@ int git_config_parse_key(const char *key, char
> **store_key, int *baselen_)
> if (!dot || i > baselen) {
> if (!iskeychar(c) ||
> (i == baselen + 1 && !isalpha(c))) {
> - error("invalid key: %s", key);
> + if (show_err)
> + error("invalid key: %s", key);
> goto out_free_ret_1;
> }
> c = tolower(c);
> } else if (c == '\n') {
> - error("invalid key (newline): %s", key);
> + if (show_err)
> + error("invalid key (newline): %s", key);
> goto out_free_ret_1;
> }
> (*store_key)[i] = c;
> @@ -1926,7 +1931,7 @@ int git_config_set_multivar_in_file(const char
> *config_filename,
> char *filename_buf = NULL;
>
> /* parse-key returns negative; flip the sign to feed exit(3) */
> - ret = 0 - git_config_parse_key(key, &store.key, &store.baselen);
> + ret = 0 - git_config_parse_key(key, &store.key, &store.baselen, 1);
> if (ret)
> goto out_free;
next prev parent reply other threads:[~2014-10-30 18:21 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-30 17:48 [PATCH] config: add show_err flag to git_config_parse_key() Tanay Abhra
2014-10-30 18:21 ` Junio C Hamano [this message]
2014-10-30 18:25 ` Tanay Abhra
-- strict thread matches above, loose matches on Subject: below --
2014-10-30 18:18 Tanay Abhra
2015-02-06 12:45 BUG: 'error: invalid key: pager.show_ref' on 'git show_ref' Andreas Krey
2015-02-06 19:33 ` Jeff King
2015-02-06 19:44 ` Junio C Hamano
2015-02-06 20:39 ` Jeff King
2015-02-10 19:45 ` [PATCH] config: add show_err flag to git_config_parse_key() Tanay Abhra
2015-02-11 0:27 ` Jeff King
2015-02-11 18:47 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqd299wh9m.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=tanayabh@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.