]> granicus.if.org Git - postgresql/commitdiff
Fix memory leak from Tom Lane.
authorBruce Momjian <bruce@momjian.us>
Sun, 20 Sep 1998 04:51:12 +0000 (04:51 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 20 Sep 1998 04:51:12 +0000 (04:51 +0000)
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-misc.c

index 4add3529dd5159fa003419a334c72e8fd8c97f31..e21d17f23f7f2190c78780f5084d60d39e7f6480 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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"))
                {
-                       tmp = fe_getauthname(errortmp);
-                       if (tmp)
-                               option->val = strdup(tmp);
+                       option->val = fe_getauthname(errortmp);
+                       continue;
                }
 
                /* ----------
@@ -1330,6 +1329,7 @@ conninfo_parse(const char *conninfo, char *errorMessage)
                        tmp = conninfo_getval("user");
                        if (tmp)
                                option->val = strdup(tmp);
+                       continue;
                }
        }
 
index 2a844167a779bd4f68dca4e6eef03a21d43a3239..7c8ea05f5702b291856c59190ae51a80fe3863ad 100644 (file)
@@ -24,7 +24,7 @@
  *
  *
  * 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 (errno == EWOULDBLOCK)
                        return 0;
+#endif
+               /* We might get ECONNRESET here if using TCP and backend died */
+#ifdef ECONNRESET
+               if (errno == ECONNRESET)
+                       goto definitelyFailed;
 #endif
                sprintf(conn->errorMessage,
                                "pqReadData() --  read() failed: errno=%d\n%s\n",
@@ -409,6 +414,11 @@ tryAgain2:
 #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
                if (errno == EWOULDBLOCK)
                        return 0;
+#endif
+               /* We might get ECONNRESET here if using TCP and backend died */
+#ifdef ECONNRESET
+               if (errno == ECONNRESET)
+                       goto definitelyFailed;
 #endif
                sprintf(conn->errorMessage,
                                "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.
         * This means the connection has been closed.  Cope.
         */
+definitelyFailed:
        sprintf(conn->errorMessage,
                        "pqReadData() -- backend closed the channel unexpectedly.\n"
                        "\tThis probably means the backend terminated abnormally"
@@ -460,7 +471,6 @@ pqFlush(PGconn *conn)
                /* Prevent being SIGPIPEd if backend has closed the connection. */
 #ifndef WIN32
                pqsigfunc       oldsighandler = pqsignal(SIGPIPE, SIG_IGN);
-
 #endif
 
                int                     sent = send(conn->sock, ptr, len, 0);
@@ -471,7 +481,11 @@ pqFlush(PGconn *conn)
 
                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)
                        {
 #ifdef EAGAIN
@@ -482,10 +496,27 @@ pqFlush(PGconn *conn)
                                case EWOULDBLOCK:
                                        break;
 #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:
                                        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));
+                                       /* We don't assume it's a fatal error... */
                                        return EOF;
                        }
                }