Git fork

send-pack: fix memory leak around duplicate refs

The 'git-send-pack(1)' allows users to push objects to a remote
repository and explicitly list the references to be pushed. The status
of each reference pushed is captured into a list mapped by refname.

If a reference fails to be updated, its error message is captured in the
`ref->remote_status` field. While the command allows duplicate ref
inputs, the list doesn't accommodate this behavior as a particular
refname is linked to a single `struct ref*` element. So if the user
inputs a reference twice like:

git send-pack remote.git A:foo B:foo

where the user is trying to update the same reference 'foo' twice and
the reference fails to be updated, we first fill `ref->remote_status`
with error message for the input 'A:foo' then we override the same field
with the error message for 'B:foo'. This override happens without first
free'ing the previous value. Fix this leak.

The current tests already incorporate the above example, but in the test
'A:foo' succeeds while 'B:foo' fails, meaning that the memory leak isn't
triggered. Add a new test with multiple duplicates.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Karthik Nayak and committed by
Junio C Hamano
77188b5b 0e358de6

+13
+7
send-pack.c
··· 257 257 refname); 258 258 continue; 259 259 } 260 + 261 + /* 262 + * Clients sending duplicate refs can cause the same value 263 + * to be overridden, causing a memory leak. 264 + */ 265 + free(hint->remote_status); 266 + 260 267 if (!strcmp(head, "ng")) { 261 268 hint->status = REF_STATUS_REMOTE_REJECT; 262 269 if (p)
+6
t/t5408-send-pack-stdin.sh
··· 73 73 verify_push A foo 74 74 ' 75 75 76 + test_expect_success 'cmdline refs with multiple duplicates' ' 77 + clear_remote && 78 + test_must_fail git send-pack remote.git A:foo B:foo C:foo && 79 + verify_push A foo 80 + ' 81 + 76 82 test_expect_success '--stdin refs come after cmdline' ' 77 83 clear_remote && 78 84 echo A:foo >input &&