http-transport: Properly cleanup the WSA context
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
diff --git a/src/transport-http.c b/src/transport-http.c
index 32ab5ab..736f21b 100644
--- a/src/transport-http.c
+++ b/src/transport-http.c
@@ -348,10 +348,6 @@ static int http_close(git_transport *transport)
if (error < 0)
return git__throw(GIT_EOSERR, "Failed to close the socket: %s", strerror(errno));
-#ifdef GIT_WIN32
- WSACleanup();
-#endif
-
return GIT_SUCCESS;
}
@@ -363,6 +359,14 @@ static void http_free(git_transport *transport)
unsigned int i;
git_pkt *p;
+#ifdef GIT_WIN32
+ /* cleanup the WSA context. note that this context
+ * can be initialized more than once with WSAStartup(),
+ * and needs to be cleaned one time for each init call
+ */
+ WSACleanup();
+#endif
+
git_vector_foreach(refs, i, p) {
git_pkt_free(p);
}
@@ -374,13 +378,9 @@ static void http_free(git_transport *transport)
free(t);
}
-
int git_transport_http(git_transport **out)
{
transport_http *t;
-#ifdef GIT_WIN32
- int ret;
-#endif
t = git__malloc(sizeof(transport_http));
if (t == NULL)
@@ -393,15 +393,15 @@ int git_transport_http(git_transport **out)
t->parent.close = http_close;
t->parent.free = http_free;
- *out = (git_transport *) t;
-
#ifdef GIT_WIN32
- ret = WSAStartup(MAKEWORD(2,2), &t->wsd);
- if (ret != 0) {
- http_free(*out);
+ /* on win32, the WSA context needs to be initialized
+ * before any socket calls can be performed */
+ if (WSAStartup(MAKEWORD(2,2), &t->wsd) != 0) {
+ http_free(t);
return git__throw(GIT_EOSERR, "Winsock init failed");
}
#endif
+ *out = (git_transport *) t;
return GIT_SUCCESS;
}