SSL_read/SSL_write do not approximate the return conventions of recv()
authorTom Lane
Mon, 4 Aug 2003 17:58:14 +0000 (17:58 +0000)
committerTom Lane
Mon, 4 Aug 2003 17:58:14 +0000 (17:58 +0000)
and send() very well at all; and in any case we can't use retval==0
for EOF due to race conditions.  Make the same fixes in the backend as
are required in libpq.

src/backend/libpq/be-secure.c

index e7f075e044a6df664ad8bd81eff1ff36d1bbe26a..dfedaf4ea90d926dbaa207f705c0466ea456e719 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/libpq/be-secure.c,v 1.39 2003/08/04 02:39:59 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/libpq/be-secure.c,v 1.40 2003/08/04 17:58:14 tgl Exp $
  *
  *   Since the server static private key ($DataDir/server.key)
  *   will normally be stored unencrypted so that the database
@@ -273,9 +273,13 @@ rloop:
                            (errcode_for_socket_access(),
                             errmsg("SSL SYSCALL error: %m")));
                else
+               {
                    ereport(COMMERROR,
                            (errcode(ERRCODE_PROTOCOL_VIOLATION),
                             errmsg("SSL SYSCALL error: EOF detected")));
+                   errno = ECONNRESET;
+                   n = -1;
+               }
                break;
            case SSL_ERROR_SSL:
                ereport(COMMERROR,
@@ -283,7 +287,6 @@ rloop:
                         errmsg("SSL error: %s", SSLerrmessage())));
                /* fall through */
            case SSL_ERROR_ZERO_RETURN:
-               secure_close(port);
                errno = ECONNRESET;
                n = -1;
                break;
@@ -291,6 +294,7 @@ rloop:
                ereport(COMMERROR,
                        (errcode(ERRCODE_PROTOCOL_VIOLATION),
                         errmsg("unrecognized SSL error code")));
+               n = -1;
                break;
        }
    }
@@ -353,9 +357,13 @@ wloop:
                            (errcode_for_socket_access(),
                             errmsg("SSL SYSCALL error: %m")));
                else
+               {
                    ereport(COMMERROR,
                            (errcode(ERRCODE_PROTOCOL_VIOLATION),
                             errmsg("SSL SYSCALL error: EOF detected")));
+                   errno = ECONNRESET;
+                   n = -1;
+               }
                break;
            case SSL_ERROR_SSL:
                ereport(COMMERROR,
@@ -363,7 +371,6 @@ wloop:
                         errmsg("SSL error: %s", SSLerrmessage())));
                /* fall through */
            case SSL_ERROR_ZERO_RETURN:
-               secure_close(port);
                errno = ECONNRESET;
                n = -1;
                break;
@@ -371,6 +378,7 @@ wloop:
                ereport(COMMERROR,
                        (errcode(ERRCODE_PROTOCOL_VIOLATION),
                         errmsg("unrecognized SSL error code")));
+               n = -1;
                break;
        }
    }