Fix memory leak from Tom Lane.

This commit is contained in:
Bruce Momjian 1998-09-20 04:51:12 +00:00
parent 3ac9688ae8
commit aa158a746c
2 changed files with 39 additions and 8 deletions

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.82 1998/09/18 16:46:05 momjian Exp $ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.83 1998/09/20 04:51:10 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1316,9 +1316,8 @@ conninfo_parse(const char *conninfo, char *errorMessage)
*/ */
if (!strcmp(option->keyword, "user")) if (!strcmp(option->keyword, "user"))
{ {
tmp = fe_getauthname(errortmp); option->val = fe_getauthname(errortmp);
if (tmp) continue;
option->val = strdup(tmp);
} }
/* ---------- /* ----------
@ -1330,6 +1329,7 @@ conninfo_parse(const char *conninfo, char *errorMessage)
tmp = conninfo_getval("user"); tmp = conninfo_getval("user");
if (tmp) if (tmp)
option->val = strdup(tmp); option->val = strdup(tmp);
continue;
} }
} }

View File

@ -24,7 +24,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.21 1998/09/03 02:10:50 momjian Exp $ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.22 1998/09/20 04:51:12 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -366,6 +366,11 @@ tryAgain:
#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
if (errno == EWOULDBLOCK) if (errno == EWOULDBLOCK)
return 0; return 0;
#endif
/* We might get ECONNRESET here if using TCP and backend died */
#ifdef ECONNRESET
if (errno == ECONNRESET)
goto definitelyFailed;
#endif #endif
sprintf(conn->errorMessage, sprintf(conn->errorMessage,
"pqReadData() -- read() failed: errno=%d\n%s\n", "pqReadData() -- read() failed: errno=%d\n%s\n",
@ -409,6 +414,11 @@ tryAgain2:
#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
if (errno == EWOULDBLOCK) if (errno == EWOULDBLOCK)
return 0; return 0;
#endif
/* We might get ECONNRESET here if using TCP and backend died */
#ifdef ECONNRESET
if (errno == ECONNRESET)
goto definitelyFailed;
#endif #endif
sprintf(conn->errorMessage, sprintf(conn->errorMessage,
"pqReadData() -- read() failed: errno=%d\n%s\n", "pqReadData() -- read() failed: errno=%d\n%s\n",
@ -425,6 +435,7 @@ tryAgain2:
* OK, we are getting a zero read even though select() says ready. * OK, we are getting a zero read even though select() says ready.
* This means the connection has been closed. Cope. * This means the connection has been closed. Cope.
*/ */
definitelyFailed:
sprintf(conn->errorMessage, sprintf(conn->errorMessage,
"pqReadData() -- backend closed the channel unexpectedly.\n" "pqReadData() -- backend closed the channel unexpectedly.\n"
"\tThis probably means the backend terminated abnormally" "\tThis probably means the backend terminated abnormally"
@ -460,7 +471,6 @@ pqFlush(PGconn *conn)
/* Prevent being SIGPIPEd if backend has closed the connection. */ /* Prevent being SIGPIPEd if backend has closed the connection. */
#ifndef WIN32 #ifndef WIN32
pqsigfunc oldsighandler = pqsignal(SIGPIPE, SIG_IGN); pqsigfunc oldsighandler = pqsignal(SIGPIPE, SIG_IGN);
#endif #endif
int sent = send(conn->sock, ptr, len, 0); int sent = send(conn->sock, ptr, len, 0);
@ -471,7 +481,11 @@ pqFlush(PGconn *conn)
if (sent < 0) if (sent < 0)
{ {
/* Anything except EAGAIN or EWOULDBLOCK is trouble */ /*
* Anything except EAGAIN or EWOULDBLOCK is trouble.
* If it's EPIPE or ECONNRESET, assume we've lost the
* backend connection permanently.
*/
switch (errno) switch (errno)
{ {
#ifdef EAGAIN #ifdef EAGAIN
@ -482,10 +496,27 @@ pqFlush(PGconn *conn)
case EWOULDBLOCK: case EWOULDBLOCK:
break; break;
#endif #endif
case EPIPE:
#ifdef ECONNRESET
case ECONNRESET:
#endif
sprintf(conn->errorMessage,
"pqFlush() -- backend closed the channel unexpectedly.\n"
"\tThis probably means the backend terminated abnormally"
" before or while processing the request.\n");
conn->status = CONNECTION_BAD; /* No more connection */
#ifdef WIN32
closesocket(conn->sock);
#else
close(conn->sock);
#endif
conn->sock = -1;
return EOF;
default: default:
sprintf(conn->errorMessage, sprintf(conn->errorMessage,
"pqFlush() -- couldn't send data: errno=%d\n%s\n", "pqFlush() -- couldn't send data: errno=%d\n%s\n",
errno, strerror(errno)); errno, strerror(errno));
/* We don't assume it's a fatal error... */
return EOF; return EOF;
} }
} }