Commit 8f342c6d by Patrick Steinhardt Committed by Carlos Martín Nieto

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.
parent 9aee7bc2
...@@ -259,6 +259,7 @@ int git_stransport_stream_new(git_stream **out, const char *host, const char *po ...@@ -259,6 +259,7 @@ int git_stransport_stream_new(git_stream **out, const char *host, const char *po
st->ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType); st->ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType);
if (!st->ctx) { if (!st->ctx) {
giterr_set(GITERR_NET, "failed to create SSL context"); giterr_set(GITERR_NET, "failed to create SSL context");
git__free(st);
return -1; return -1;
} }
...@@ -268,7 +269,8 @@ int git_stransport_stream_new(git_stream **out, const char *host, const char *po ...@@ -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 = SSLSetProtocolVersionMin(st->ctx, kTLSProtocol1)) != noErr ||
(ret = SSLSetProtocolVersionMax(st->ctx, kTLSProtocol12)) != noErr || (ret = SSLSetProtocolVersionMax(st->ctx, kTLSProtocol12)) != noErr ||
(ret = SSLSetPeerDomainName(st->ctx, host, strlen(host))) != 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); return stransport_error(ret);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment