Re: Re*: [PATCH] change contract between system_path and it's callers
- From
Alexander Kuleshov <kuleshovmail@gmail.com>
- Date
- Nov 25, 2014, 06:45 UTC
- Message-ID
- <CANCZXo7yDJCuhKVFG3QfSSoem+KN_9VCbGerTd+5tqQuzA7dbg@mail.gmail.com>
- In-Reply-To
- <xmqqbnnwwcg0.fsf@gitster.dls.corp.google.com>
Hello Junio,
I returned static to git_etc_gitattributes return value, but now i can't understand where to free 'system_wide'. As i understand correctly attr.c has following API for querying attributes:
git_attr
git_check_attr
And as i see in code git_attr doesn't use git_attr_check, so now we have only git_check_attr and git_all_stars functions which are through prepare_attr_stack and bootstrap_attr_stack in it uses path which returned by system_path. So you're right if i free etc_attributes like this and git_etc_gitattributes will return static value we'll have access to freed memory if it will called again. But we have no access to etc_attributes outside bootstrap_attr_stack so where will be best place to free it?
Thank you
2014-11-25 2:50 GMT+06:00 Junio C Hamano <gitster@pobox.com>:
Show 22 quoted lines
> Alex Kuleshov <kuleshovmail@gmail.com> writes:
>
>>> One thing to note is that this illustration does not consider memory
>>> pointed at by the "system_wide" variable here (from attr.c)
>>>
>>> static const char *git_etc_gitattributes(void)
>>> {
>>> static const char *system_wide;
>>> if (!system_wide)
>>> system_wide = system_path(ETC_GITATTRIBUTES);
>>> return system_wide;
>>> }
>>>
>>> at the point of process exit as a "leak".
>>
>> But why? We allocated memory to "system_wide" with system_path, next git
>> will exit somewhere with die, but system_wide didn't free... Or i'm
>> wrong here too?
>
> It is in the same league as "static const char *git_dir" and friends
> that appear in the file-scope-static of environment.c. Keeping small
> things around to be cleaned up by exit() is not a crime.-- _________________________ 0xAX