From bb8cc2b53482bf6b4d32280946ee86e2df5f630a Mon Sep 17 00:00:00 2001 From: Hiroshi Inoue Date: Mon, 23 Nov 2009 13:31:26 +0000 Subject: [PATCH] 1) Fix memory leaks on connection failure (Shouji morimoto). 2) Suppress some compilation errors and warnings. --- connection.c | 1 + loadlib.c | 7 +++++- socket.c | 62 ++++++++++++++++++++++++---------------------------- version.h | 2 +- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/connection.c b/connection.c index e628ace..dfbfe5f 100644 --- a/connection.c +++ b/connection.c @@ -3735,6 +3735,7 @@ inolog("status=%d\n", pqret); { mylog("password retry\n"); PQfinish(pqconn); + sock->pqconn = NULL; self->sock = sock; return -1; } diff --git a/loadlib.c b/loadlib.c index 1abd70d..c1aa565 100644 --- a/loadlib.c +++ b/loadlib.c @@ -76,8 +76,8 @@ CSTR pgenlistdll = "PGENLISTA.dll"; #endif /* DYNAMIC_LOAD */ #endif /* WIN32 */ -#ifndef NOT_USE_LIBPQ CSTR libpq = "libpq"; +#ifndef NOT_USE_LIBPQ CSTR checkproc = "PQconninfoParse"; static int sslverify_available = -1; #endif /* NOT_USE_LIBPQ */ @@ -319,6 +319,11 @@ void *CALL_PQconnectdb(const char *conninfo, BOOL *libpqLoaded) #endif /* _MSC_DELAY_LOAD_IMPORT */ return pqconn; } +#else +BOOL ssl_verify_available(void) +{ + return FALSE; +} #endif /* NOT_USE_LIBPQ */ #ifdef _HANDLE_ENLIST_IN_DTC_ diff --git a/socket.c b/socket.c index d131d48..b3c73c2 100644 --- a/socket.c +++ b/socket.c @@ -128,40 +128,40 @@ SOCK_Destructor(SocketClass *self) mylog("SOCK_Destructor\n"); if (!self) return; - if (self->socket != (SOCKETFD) -1) - { #ifndef NOT_USE_LIBPQ - if (self->pqconn) + if (self->pqconn) + { + if (self->via_libpq) { - if (self->via_libpq) - { - PQfinish(self->pqconn); - /* UnloadDelayLoadedDLLs(NULL != self->ssl); */ - } - self->via_libpq = FALSE; - self->pqconn = NULL; + PQfinish(self->pqconn); + /* UnloadDelayLoadedDLLs(NULL != self->ssl); */ + } + self->via_libpq = FALSE; + self->pqconn = NULL; #ifdef USE_SSL - self->ssl = NULL; + self->ssl = NULL; #endif - } - else + } + else #endif /* NOT_USE_LIBPQ */ + { + if (self->socket != (SOCKETFD) -1) { -#ifdef USE_SSPI - if (self->ssd) - { - ReleaseSvcSpecData(self); - free(self->ssd); - self->ssd = NULL; - } - self->sspisvcs = 0; -#endif /* USE_SSPI */ SOCK_put_char(self, 'X'); if (PG_PROTOCOL_74 == self->pversion) SOCK_put_int(self, 4, 4); SOCK_flush_output(self); closesocket(self->socket); } +#ifdef USE_SSPI + if (self->ssd) + { + ReleaseSvcSpecData(self); + free(self->ssd); + self->ssd = NULL; + } + self->sspisvcs = 0; +#endif /* USE_SSPI */ } if (self->buffer_in) @@ -302,7 +302,7 @@ retry: if (self->socket == (SOCKETFD) -1) { SOCK_set_error(self, SOCKET_COULD_NOT_CREATE_SOCKET, "Could not create Socket."); - return 0; + goto cleanup; } #ifdef TCP_NODELAY if (family != AF_UNIX) @@ -315,9 +315,7 @@ retry: if (setsockopt(self->socket, IPPROTO_TCP, TCP_NODELAY, (char *) &i, len) < 0) { SOCK_set_error(self, SOCKET_COULD_NOT_CONNECT, "Could not set socket to NODELAY."); - closesocket(self->socket); - self->socket = (SOCKETFD) -1; - return 0; + goto cleanup; } } #endif /* TCP_NODELAY */ @@ -506,10 +504,9 @@ static int SOCK_wait_for_ready(SocketClass *sock, BOOL output, int retry_count) static int SOCK_SSPI_recv(SocketClass *self, void *buffer, int len) { #ifdef USE_SSPI - if (!self->sspisvcs || !self->ssd) - return recv(self->socket, (char *) buffer, len, RECV_FLAG); - else + if (self->sspisvcs && self->ssd) return SSPI_recv(self, (char *) buffer, len); + else #endif /* USE_SSPI */ return recv(self->socket, (char *) buffer, len, RECV_FLAG); } @@ -517,12 +514,9 @@ static int SOCK_SSPI_recv(SocketClass *self, void *buffer, int len) static int SOCK_SSPI_send(SocketClass *self, const void *buffer, int len) { #ifdef USE_SSPI - CSTR func = "SOCK_SSPI_send"; - - if (!self->sspisvcs || !self->ssd) - return send(self->socket, (char *) buffer, len, SEND_FLAG); - else + if (self->sspisvcs && self->ssd) return SSPI_send(self, buffer, len); + else #endif /* USE_SSPI */ return send(self->socket, (char *) buffer, len, SEND_FLAG); } diff --git a/version.h b/version.h index f6be117..1fa49c9 100644 --- a/version.h +++ b/version.h @@ -12,6 +12,6 @@ #define POSTGRESDRIVERVERSION "08.04.0101" #define POSTGRES_RESOURCE_VERSION "08.04.0101\0" #define PG_DRVFILE_VERSION 8,4,01,01 -#define PG_BUILD_VERSION "200911150001" +#define PG_BUILD_VERSION "200911180003" #endif -- 2.39.5