On Mon, Jun 16, 2014 at 01:27:12AM -0700, Tanay Abhra wrote:

> +static int config_cache_callback(const char *key, const char *value, void 
> *unused)
> +{
> +     config_cache_set_value(key, value);
> +     return 0;
> +}

This gets the normalized key, which is good; you should be able to just
hash/lookup values without further munging as long as they, too, are
normalized (you may want to note that in the documentaiton for
config_cache_find_entry and friends).

The value may be a string value, or NULL if it is a true boolean. That
value gets passed to...

> +static int config_cache_set_value(const char *key, const char *value)
> +{
> +     struct hashmap *config_cache;
> +     struct config_cache_entry *e;
> +
> +     config_cache = get_config_cache();
> +     e = config_cache_find_entry(key);
> +     if (!e) {
> +             e = xmalloc(sizeof(*e));
> +             hashmap_entry_init(e, strhash(key));
> +             e->key = xstrdup(key);
> +             string_list_init_dup(&e->value_list);
> +             string_list_append(&e->value_list, value);
> +             hashmap_add(config_cache, e);
> +     } else {
> +             string_list_append(&e->value_list, value);
> +     }
> +     return 0;
> +}

...this function, which then passes it to string_list_append. Which is
going to call xstrdup() on it, which will then segfault.

You need some mechanism to store entries that are NULL. It may be enough
to silently convert them into the string "true" inside the cached
storage. But there may be callers who treat NULL specially (e.g., a
tri-state true/false/auto that treats a bare boolean as "auto"); you'd
need to check.

The other alternative is to use something besides string_list that can
handle a NULL.  You may also need to give some thought to how such NULLs
would be handled by git_config_get_string() (since a NULL there also
means "not found").

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to