[PATCH 3/6] remote: check branch->merge before access in branch_release

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Jacob Keller <jacob.keller@xxxxxxxxx>

The branch_release function doesn't check the merge field before
accessing it, based on an assumption that merge will be set if
branch->merge_nr is non-zero.

This is not always the case. It turns out that branch->merge is not
initialized until set_merge() is called, but branch->merge_nr can be
non-zero from handle_config() calling add_merge().

set_merge() is not called until branch_get(). This function does set
merge_nr to zero if merge is not initialized. However, branch_release is
called on every branch when tearing down a repository.

An upcoming change to submodule--helper will initialize the remote state
by calling read_config(). In some cases, this results in branches in the
remote_state which have a non-zero merge_nr but no merge array. This
results in a crash when tearing the repository down.

To fix this, lets simply check if merge is valid before attempting to
release its contents.

This makes it safe to initialize the remote_state for a submodule
repository without crashing on teardown.

Signed-off-by: Jacob Keller <jacob.keller@xxxxxxxxx>
---
 remote.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/remote.c b/remote.c
index 7092b12209d93e20ce1ed3b7d9e4cbac058c57ff..1035f0cd32d034cce05bd2a3d829ec90795ff4e2 100644
--- a/remote.c
+++ b/remote.c
@@ -253,9 +253,11 @@ static void branch_release(struct branch *branch)
 	free((char *)branch->refname);
 	free(branch->remote_name);
 	free(branch->pushremote_name);
-	for (int i = 0; i < branch->merge_nr; i++)
-		refspec_item_clear(branch->merge[i]);
-	free(branch->merge);
+	if (branch->merge) {
+		for (int i = 0; i < branch->merge_nr; i++)
+			refspec_item_clear(branch->merge[i]);
+		free(branch->merge);
+	}
 }
 
 static struct rewrite *make_rewrite(struct rewrites *r,

-- 
2.48.1.397.gec9d649cc640





[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux