summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2016-08-08 14:47:32 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2016-10-01 17:41:27 +0200
commit8f342c6d6b4efb794d96e58c4420dc75b856af99 (patch)
treec4f17eaf7b80913ba8b8e89476893cb112b89931
parent9aee7bc249ede39a7cf4d3bbbbc8eb273cfc7989 (diff)
downloadlibgit2-8f342c6d6b4efb794d96e58c4420dc75b856af99.tar.gz
stransport: do not use `git_stream_free` on uninitialized stransport
When failing to initialize a new stransport stream, we try to release already allocated memory by calling out to `git_stream_free`, which in turn called out to the stream's `free` function pointer. As we only initialize the function pointer later on, this leads to a `NULL` pointer exception. Furthermore, plug another memory leak when failing to create the SSL context.
-rw-r--r--src/stransport_stream.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/stransport_stream.c b/src/stransport_stream.c
index fc5f862a6..9d87d6029 100644
--- a/src/stransport_stream.c
+++ b/src/stransport_stream.c
@@ -259,6 +259,7 @@ int git_stransport_stream_new(git_stream **out, const char *host, const char *po
st->ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType);
if (!st->ctx) {
giterr_set(GITERR_NET, "failed to create SSL context");
+ git__free(st);
return -1;
}
@@ -268,7 +269,8 @@ int git_stransport_stream_new(git_stream **out, const char *host, const char *po
(ret = SSLSetProtocolVersionMin(st->ctx, kTLSProtocol1)) != noErr ||
(ret = SSLSetProtocolVersionMax(st->ctx, kTLSProtocol12)) != noErr ||
(ret = SSLSetPeerDomainName(st->ctx, host, strlen(host))) != noErr) {
- git_stream_free((git_stream *)st);
+ CFRelease(st->ctx);
+ git__free(st);
return stransport_error(ret);
}