On Mon, Feb 22, 2016 at 07:52:25PM +0700, Nguyễn Thái Ngọc Duy wrote:
> fill_textconv() have four code paths to return a new buffer. Two of
> them, run_textconv() and notes_cache_get(), return a newly allocated
> buffer. The other two return either a constant string or an existing
> buffer (mmfile_t). We can only free the result buffer if it's allocated
> by fill_textconv(). Correct all call sites.
Right, and those two cases (allocated or not) should follow based on
whether you passed in a textconv-enabled driver.
> diff --git a/builtin/blame.c b/builtin/blame.c
> index cb6f2fb..b5477ad 100644
> --- a/builtin/blame.c
> +++ b/builtin/blame.c
> @@ -166,7 +166,7 @@ int textconv_object(const char *path,
> df = alloc_filespec(path);
> fill_filespec(df, sha1, sha1_valid, mode);
> textconv = get_textconv(df);
> - if (!textconv) {
> + if (!textconv || !textconv->textconv) {
> free_filespec(df);
> return 0;
> }
This change (and the other similar ones) doesn't make any sense to me.
The point of get_textconv() is to return the userdiff driver if and only
if it has textconv enabled.
I have a feeling you were confused by the fact that fill_textconv()
does:
if (!driver || !driver->textconv)
to decide whether to allocate the textconv buffer. The latter half of
that is really just defensive programming, and I think this would
probably be better as:
if (driver)
....
assert(driver->textconv);
to make it more clear that we assume the parameter came from
get_textconv().
And if there's a case that triggers that assert(), then I think the bug
is in the caller, which should be fixed.
Is there a case I'm missing here where we actually leak memory or try to
free non-allocated memory? I didn't see it.
-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html