git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] connect.c: Fix memory leak
@ 2015-03-09 16:58 Stefan Beller
  2015-03-09 16:58 ` [PATCH 2/3] bundle.c: fix " Stefan Beller
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Stefan Beller @ 2015-03-09 16:58 UTC (permalink / raw)
  To: gitster; +Cc: git, Stefan Beller

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 connect.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/connect.c b/connect.c
index ce0e121..6090211 100644
--- a/connect.c
+++ b/connect.c
@@ -739,6 +739,7 @@ struct child_process *git_connect(int fd[2], const char *url,
 
 				free(hostandport);
 				free(path);
+				free(conn);
 				return NULL;
 			} else {
 				ssh = getenv("GIT_SSH_COMMAND");
-- 
2.3.0.81.gc37f363

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/3] bundle.c: fix memory leak
  2015-03-09 16:58 [PATCH 1/3] connect.c: Fix memory leak Stefan Beller
@ 2015-03-09 16:58 ` Stefan Beller
  2015-03-10 22:40   ` Junio C Hamano
  2015-03-09 16:58 ` [PATCH 3/3] builtin/help.c: " Stefan Beller
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 13+ messages in thread
From: Stefan Beller @ 2015-03-09 16:58 UTC (permalink / raw)
  To: gitster; +Cc: git, Stefan Beller

The continue statements nearby also have an accompanying free(ref);

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 bundle.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/bundle.c b/bundle.c
index 2e2dbd5..534783d 100644
--- a/bundle.c
+++ b/bundle.c
@@ -342,6 +342,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 		if (e->item->type == OBJ_TAG &&
 				!is_tag_in_date_range(e->item, revs)) {
 			e->item->flags |= UNINTERESTING;
+			free(ref);
 			continue;
 		}
 
-- 
2.3.0.81.gc37f363

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/3] builtin/help.c: fix memory leak
  2015-03-09 16:58 [PATCH 1/3] connect.c: Fix memory leak Stefan Beller
  2015-03-09 16:58 ` [PATCH 2/3] bundle.c: fix " Stefan Beller
@ 2015-03-09 16:58 ` Stefan Beller
  2015-03-10 22:43   ` Junio C Hamano
  2015-03-09 19:23 ` [PATCH 1/3] connect.c: Fix " Torsten Bögershausen
  2015-03-10 22:35 ` Junio C Hamano
  3 siblings, 1 reply; 13+ messages in thread
From: Stefan Beller @ 2015-03-09 16:58 UTC (permalink / raw)
  To: gitster; +Cc: git, Stefan Beller

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 builtin/help.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/builtin/help.c b/builtin/help.c
index 6133fe4..a1f5a0a 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -456,7 +456,7 @@ static void list_common_guides_help(void)
 int cmd_help(int argc, const char **argv, const char *prefix)
 {
 	int nongit;
-	const char *alias;
+	char *alias;
 	enum help_format parsed_help_format;
 
 	argc = parse_options(argc, argv, prefix, builtin_help_options,
@@ -499,6 +499,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
 	alias = alias_lookup(argv[0]);
 	if (alias && !is_git_command(argv[0])) {
 		printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
+		free(alias);
 		return 0;
 	}
 
-- 
2.3.0.81.gc37f363

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] connect.c: Fix memory leak
  2015-03-09 16:58 [PATCH 1/3] connect.c: Fix memory leak Stefan Beller
  2015-03-09 16:58 ` [PATCH 2/3] bundle.c: fix " Stefan Beller
  2015-03-09 16:58 ` [PATCH 3/3] builtin/help.c: " Stefan Beller
@ 2015-03-09 19:23 ` Torsten Bögershausen
  2015-03-10 22:35 ` Junio C Hamano
  3 siblings, 0 replies; 13+ messages in thread
From: Torsten Bögershausen @ 2015-03-09 19:23 UTC (permalink / raw)
  To: Stefan Beller, gitster; +Cc: git

On 2015-03-09 17.58, Stefan Beller wrote:
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  connect.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/connect.c b/connect.c
> index ce0e121..6090211 100644
> --- a/connect.c
> +++ b/connect.c
> @@ -739,6 +739,7 @@ struct child_process *git_connect(int fd[2], const char *url,
>  
>  				free(hostandport);
>  				free(path);
> +				free(conn);
>  				return NULL;
>  			} else {
>  				ssh = getenv("GIT_SSH_COMMAND");
> 
Nice catch, thanks.
(Even if it is not sooo serious today, the current implementation of Git just dies
when connection is NULL)

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] connect.c: Fix memory leak
  2015-03-09 16:58 [PATCH 1/3] connect.c: Fix memory leak Stefan Beller
                   ` (2 preceding siblings ...)
  2015-03-09 19:23 ` [PATCH 1/3] connect.c: Fix " Torsten Bögershausen
@ 2015-03-10 22:35 ` Junio C Hamano
  3 siblings, 0 replies; 13+ messages in thread
From: Junio C Hamano @ 2015-03-10 22:35 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git

Stefan Beller <sbeller@google.com> writes:

> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  connect.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/connect.c b/connect.c
> index ce0e121..6090211 100644
> --- a/connect.c
> +++ b/connect.c
> @@ -739,6 +739,7 @@ struct child_process *git_connect(int fd[2], const char *url,
>  
>  				free(hostandport);
>  				free(path);
> +				free(conn);
>  				return NULL;

The lack of sufficient context in the patch made me wonder if merely
freeing conn is sufficient or do we need some process related
clean-up before freeing it.

It appears that this codepath is used only when debugging with
CONNECT_DIAG_URL and we didn't start any process --- we only
cleared it with a few arrays initialized to empty at this point of
the code.

So it should be safe.  I wish I didn't have to do the digging
myself, though ;-)

>  			} else {
>  				ssh = getenv("GIT_SSH_COMMAND");

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] bundle.c: fix memory leak
  2015-03-09 16:58 ` [PATCH 2/3] bundle.c: fix " Stefan Beller
@ 2015-03-10 22:40   ` Junio C Hamano
  2015-03-10 23:08     ` Stefan Beller
  0 siblings, 1 reply; 13+ messages in thread
From: Junio C Hamano @ 2015-03-10 22:40 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git

Stefan Beller <sbeller@google.com> writes:

> The continue statements nearby also have an accompanying free(ref);
>
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---

I wonder what happens when dwim_ref() returned 2 or more, though.

>  bundle.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/bundle.c b/bundle.c
> index 2e2dbd5..534783d 100644
> --- a/bundle.c
> +++ b/bundle.c
> @@ -342,6 +342,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
>  		if (e->item->type == OBJ_TAG &&
>  				!is_tag_in_date_range(e->item, revs)) {
>  			e->item->flags |= UNINTERESTING;
> +			free(ref);
>  			continue;
>  		}

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] builtin/help.c: fix memory leak
  2015-03-09 16:58 ` [PATCH 3/3] builtin/help.c: " Stefan Beller
@ 2015-03-10 22:43   ` Junio C Hamano
  2015-03-10 23:50     ` Stefan Beller
  0 siblings, 1 reply; 13+ messages in thread
From: Junio C Hamano @ 2015-03-10 22:43 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git

Stefan Beller <sbeller@google.com> writes:

> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  builtin/help.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/builtin/help.c b/builtin/help.c
> index 6133fe4..a1f5a0a 100644
> --- a/builtin/help.c
> +++ b/builtin/help.c
> @@ -456,7 +456,7 @@ static void list_common_guides_help(void)
>  int cmd_help(int argc, const char **argv, const char *prefix)
>  {
>  	int nongit;
> -	const char *alias;
> +	char *alias;
>  	enum help_format parsed_help_format;
>  
>  	argc = parse_options(argc, argv, prefix, builtin_help_options,
> @@ -499,6 +499,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
>  	alias = alias_lookup(argv[0]);
>  	if (alias && !is_git_command(argv[0])) {
>  		printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
> +		free(alias);

Hmph, does this memory belong to us, or are we peeking into the
cached data in the config cache layer?


>  		return 0;
>  	}

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] bundle.c: fix memory leak
  2015-03-10 22:40   ` Junio C Hamano
@ 2015-03-10 23:08     ` Stefan Beller
  2015-03-10 23:17       ` Junio C Hamano
  0 siblings, 1 reply; 13+ messages in thread
From: Stefan Beller @ 2015-03-10 23:08 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git@vger.kernel.org

On Tue, Mar 10, 2015 at 3:40 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Stefan Beller <sbeller@google.com> writes:
>
>> The continue statements nearby also have an accompanying free(ref);
>>
>> Signed-off-by: Stefan Beller <sbeller@google.com>
>> ---
>
> I wonder what happens when dwim_ref() returned 2 or more, though.

That should also be fixed I guess. I'll look into it.

These one liner fixes are mostly done as a side project
having fun, just doing what the code analysis tools says,
sorry for not catching that one.

Maybe instead of the reoccuring pattern

    free(ref);
    continue;

we could just have a

    goto cleanup

which goes to the end of the loop where we have
the free anyway.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] bundle.c: fix memory leak
  2015-03-10 23:08     ` Stefan Beller
@ 2015-03-10 23:17       ` Junio C Hamano
  2015-03-10 23:51         ` Stefan Beller
  0 siblings, 1 reply; 13+ messages in thread
From: Junio C Hamano @ 2015-03-10 23:17 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git@vger.kernel.org

Stefan Beller <sbeller@google.com> writes:

> On Tue, Mar 10, 2015 at 3:40 PM, Junio C Hamano <gitster@pobox.com> wrote:
>> Stefan Beller <sbeller@google.com> writes:
>>
>>> The continue statements nearby also have an accompanying free(ref);
>>>
>>> Signed-off-by: Stefan Beller <sbeller@google.com>
>>> ---
>>
>> I wonder what happens when dwim_ref() returned 2 or more, though.
>
> That should also be fixed I guess. I'll look into it.
>
> These one liner fixes are mostly done as a side project
> having fun, just doing what the code analysis tools says,
> sorry for not catching that one.
>
> Maybe instead of the reoccuring pattern
>
>     free(ref);
>     continue;
>
> we could just have a
>
>     goto cleanup
>
> which goes to the end of the loop where we have
> the free anyway.

Yeah, I suspect that the end result may look more like that if you
cover the dwim_ref() one as well.

Thanks.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] builtin/help.c: fix memory leak
  2015-03-10 22:43   ` Junio C Hamano
@ 2015-03-10 23:50     ` Stefan Beller
  2015-03-11  3:52       ` Junio C Hamano
  0 siblings, 1 reply; 13+ messages in thread
From: Stefan Beller @ 2015-03-10 23:50 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git@vger.kernel.org

On Tue, Mar 10, 2015 at 3:43 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Stefan Beller <sbeller@google.com> writes:
>
>> Signed-off-by: Stefan Beller <sbeller@google.com>
>> ---
>>  builtin/help.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/builtin/help.c b/builtin/help.c
>> index 6133fe4..a1f5a0a 100644
>> --- a/builtin/help.c
>> +++ b/builtin/help.c
>> @@ -456,7 +456,7 @@ static void list_common_guides_help(void)
>>  int cmd_help(int argc, const char **argv, const char *prefix)
>>  {
>>       int nongit;
>> -     const char *alias;
>> +     char *alias;
>>       enum help_format parsed_help_format;
>>
>>       argc = parse_options(argc, argv, prefix, builtin_help_options,
>> @@ -499,6 +499,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
>>       alias = alias_lookup(argv[0]);
>>       if (alias && !is_git_command(argv[0])) {
>>               printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
>> +             free(alias);
>
> Hmph, does this memory belong to us, or are we peeking into the
> cached data in the config cache layer?

So  alias_lookup(..) is a wrapper around git_config_string essentially
(some more git_config_functions are involved, but we eventually reach
git_config_string), where we have

    *dest = xstrdup(value);

so I think we need to free that memory, as the config cache layer doesn't
care any more.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 2/3] bundle.c: fix memory leak
  2015-03-10 23:17       ` Junio C Hamano
@ 2015-03-10 23:51         ` Stefan Beller
  2015-03-11  3:57           ` Junio C Hamano
  0 siblings, 1 reply; 13+ messages in thread
From: Stefan Beller @ 2015-03-10 23:51 UTC (permalink / raw)
  To: gitster; +Cc: git, Stefan Beller

There was one continue statement without an accompanying `free(ref)`.
Instead of adding that, replace all the free&&continue with a goto
just after writing the refs, where we'd do the free anyway and then
reloop.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 bundle.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/bundle.c b/bundle.c
index 2e2dbd5..f732c92 100644
--- a/bundle.c
+++ b/bundle.c
@@ -334,7 +334,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 		if (e->item->flags & UNINTERESTING)
 			continue;
 		if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
-			continue;
+			goto skip_write_ref;
 		if (read_ref_full(e->name, RESOLVE_REF_READING, sha1, &flag))
 			flag = 0;
 		display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
@@ -342,7 +342,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 		if (e->item->type == OBJ_TAG &&
 				!is_tag_in_date_range(e->item, revs)) {
 			e->item->flags |= UNINTERESTING;
-			continue;
+			goto skip_write_ref;
 		}
 
 		/*
@@ -357,8 +357,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 		if (!(e->item->flags & SHOWN) && e->item->type == OBJ_COMMIT) {
 			warning(_("ref '%s' is excluded by the rev-list options"),
 				e->name);
-			free(ref);
-			continue;
+			goto skip_write_ref;
 		}
 		/*
 		 * If you run "git bundle create bndl v1.0..v2.0", the
@@ -388,8 +387,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 				obj->flags |= SHOWN;
 				add_pending_object(revs, obj, e->name);
 			}
-			free(ref);
-			continue;
+			goto skip_write_ref;
 		}
 
 		ref_count++;
@@ -397,6 +395,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 		write_or_die(bundle_fd, " ", 1);
 		write_or_die(bundle_fd, display_ref, strlen(display_ref));
 		write_or_die(bundle_fd, "\n", 1);
+ skip_write_ref:
 		free(ref);
 	}
 
-- 
2.3.0.81.gc37f363

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] builtin/help.c: fix memory leak
  2015-03-10 23:50     ` Stefan Beller
@ 2015-03-11  3:52       ` Junio C Hamano
  0 siblings, 0 replies; 13+ messages in thread
From: Junio C Hamano @ 2015-03-11  3:52 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git@vger.kernel.org

Stefan Beller <sbeller@google.com> writes:

>> Hmph, does this memory belong to us, or are we peeking into the
>> cached data in the config cache layer?
>
> So  alias_lookup(..) is a wrapper around git_config_string essentially
> (some more git_config_functions are involved, but we eventually reach
> git_config_string), where we have
>
>     *dest = xstrdup(value);
>
> so I think we need to free that memory, as the config cache layer doesn't
> care any more.

Ah, OK, thanks.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] bundle.c: fix memory leak
  2015-03-10 23:51         ` Stefan Beller
@ 2015-03-11  3:57           ` Junio C Hamano
  0 siblings, 0 replies; 13+ messages in thread
From: Junio C Hamano @ 2015-03-11  3:57 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git

Stefan Beller <sbeller@google.com> writes:

> There was one continue statement without an accompanying `free(ref)`.
> Instead of adding that, replace all the free&&continue with a goto
> just after writing the refs, where we'd do the free anyway and then
> reloop.
>
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  bundle.c | 11 +++++------
>  1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/bundle.c b/bundle.c
> index 2e2dbd5..f732c92 100644
> --- a/bundle.c
> +++ b/bundle.c
> @@ -334,7 +334,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
>  		if (e->item->flags & UNINTERESTING)
>  			continue;
>  		if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
> -			continue;
> +			goto skip_write_ref;

Thanks.

I briefly wondered if we need to initialize ref=NULL for this to
work, because dwim_ref() does not need to clear ref when it says
"nothing matches", but the function actually clears it upfront, so
we should be OK.

> ...
> @@ -397,6 +395,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
>  		write_or_die(bundle_fd, " ", 1);
>  		write_or_die(bundle_fd, display_ref, strlen(display_ref));
>  		write_or_die(bundle_fd, "\n", 1);
> + skip_write_ref:
>  		free(ref);
>  	}

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2015-03-11  3:57 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-09 16:58 [PATCH 1/3] connect.c: Fix memory leak Stefan Beller
2015-03-09 16:58 ` [PATCH 2/3] bundle.c: fix " Stefan Beller
2015-03-10 22:40   ` Junio C Hamano
2015-03-10 23:08     ` Stefan Beller
2015-03-10 23:17       ` Junio C Hamano
2015-03-10 23:51         ` Stefan Beller
2015-03-11  3:57           ` Junio C Hamano
2015-03-09 16:58 ` [PATCH 3/3] builtin/help.c: " Stefan Beller
2015-03-10 22:43   ` Junio C Hamano
2015-03-10 23:50     ` Stefan Beller
2015-03-11  3:52       ` Junio C Hamano
2015-03-09 19:23 ` [PATCH 1/3] connect.c: Fix " Torsten Bögershausen
2015-03-10 22:35 ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).