Re: [PATCH] * remote.c (valid_fetch_refspec): remove useless if-before-free test

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH] * remote.c (valid_fetch_refspec): remove useless if-before-free test

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:45:12

Brandon Casey [off-list ref] writes:
quoted hunk
Maybe we should also begin the process of not leaking memory here...
diff --git a/remote.c b/remote.c
index 7f2897b..984ad1b 100644
--- a/remote.c
+++ b/remote.c
@@ -449,6 +449,20 @@ static int verify_refname(char *name, int is_glob)
	return result;
 }
 
+void free_refspecs(struct refspec *refspec, int nr_refspec)
+{
+	int i;
+
+	if (!refspec)
+		return;
+
+	for (i = 0; i < nr_refspec; i++) {
+		free(refspec[i].src);
+		free(refspec[i].dst);
+	}
+	free(refspec);
+}
Are you sure all the codepaths that stuff refspec[].{src,dst} give
freeable pointer?  E.g. if anybody splits a originally single string
"refs/heads/foo:refs/remotes/origin/foo" into two by replacing the colon
with NUL and pointing the halves, and/or such string came from argv[]
without strdup(), I'd imagine free() would not like you very much.

I didn't look, though.

Re: [PATCH] * remote.c (valid_fetch_refspec): remove useless if-before-free test

From: Brandon Casey <hidden>
Date: 2016-06-15 22:45:12

Junio C Hamano wrote:
Brandon Casey [off-list ref] writes:
quoted
Maybe we should also begin the process of not leaking memory here...
diff --git a/remote.c b/remote.c
index 7f2897b..984ad1b 100644
--- a/remote.c
+++ b/remote.c
@@ -449,6 +449,20 @@ static int verify_refname(char *name, int is_glob)
	return result;
 }
 
+void free_refspecs(struct refspec *refspec, int nr_refspec)
+{
+	int i;
+
+	if (!refspec)
+		return;
+
+	for (i = 0; i < nr_refspec; i++) {
+		free(refspec[i].src);
+		free(refspec[i].dst);
+	}
+	free(refspec);
+}
Are you sure all the codepaths that stuff refspec[].{src,dst} give
freeable pointer?
remote.c:parse_refspec_internal() always does. This function is the
producer of the refspec that is being passed to free_refspecs() in the two
places where the patch called it.

The code paths for each additionally use of free_refspecs would have to
check that it is safe. Perhaps a comment is in order.

If you don't think we're ready for free_refspecs we can still call free()
manually in the two places I called free_refspecs.

-brandon
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help