if (SOCK_ERRNO == ECONNRESET)
            goto definitelyFailed;
 #endif
-       printfPQExpBuffer(&conn->errorMessage,
+       /* in SSL mode, pqsecure_read set the error message */
+       if (conn->ssl == NULL)
+           printfPQExpBuffer(&conn->errorMessage,
                   libpq_gettext("could not receive data from server: %s\n"),
                          SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
        return -1;
        if (SOCK_ERRNO == ECONNRESET)
            goto definitelyFailed;
 #endif
-       printfPQExpBuffer(&conn->errorMessage,
+       /* in SSL mode, pqsecure_read set the error message */
+       if (conn->ssl == NULL)
+           printfPQExpBuffer(&conn->errorMessage,
                   libpq_gettext("could not receive data from server: %s\n"),
                          SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
        return -1;
     * means the connection has been closed.  Cope.
     */
 definitelyFailed:
-   printfPQExpBuffer(&conn->errorMessage,
-                     libpq_gettext(
+   /* in SSL mode, pqsecure_read set the error message */
+   if (conn->ssl == NULL)
+       printfPQExpBuffer(&conn->errorMessage,
+                         libpq_gettext(
                                "server closed the connection unexpectedly\n"
                   "\tThis probably means the server terminated abnormally\n"
                             "\tbefore or while processing the request.\n"));
 #ifdef ECONNRESET
                case ECONNRESET:
 #endif
-                   printfPQExpBuffer(&conn->errorMessage,
-                                     libpq_gettext(
+                   /* in SSL mode, pqsecure_write set the error message */
+                   if (conn->ssl == NULL)
+                       printfPQExpBuffer(&conn->errorMessage,
+                                         libpq_gettext(
                                "server closed the connection unexpectedly\n"
                    "\tThis probably means the server terminated abnormally\n"
                             "\tbefore or while processing the request.\n"));
                    return -1;
 
                default:
-                   printfPQExpBuffer(&conn->errorMessage,
+                   /* in SSL mode, pqsecure_write set the error message */
+                   if (conn->ssl == NULL)
+                       printfPQExpBuffer(&conn->errorMessage,
                        libpq_gettext("could not send data to server: %s\n"),
                            SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
                    /* We don't assume it's a fatal error... */
 
 
 /*
  * Read data from a secure connection.
+ *
+ * If SSL is in use, this function is responsible for putting a suitable
+ * message into conn->errorMessage upon error; but the caller does that
+ * when not using SSL.  In either case, caller uses the returned errno
+ * to decide whether to continue/retry after error.
  */
 ssize_t
 pqsecure_read(PGconn *conn, void *ptr, size_t len)
        switch (err)
        {
            case SSL_ERROR_NONE:
+               if (n < 0)
+               {
+                   printfPQExpBuffer(&conn->errorMessage,
+                                     libpq_gettext("SSL_read failed but did not provide error information\n"));
+                   /* assume the connection is broken */
+                   SOCK_ERRNO_SET(ECONNRESET);
+               }
                break;
            case SSL_ERROR_WANT_READ:
                n = 0;
                {
                    char        sebuf[256];
 
-                   if (n == -1)
+                   if (n < 0)
                    {
                        REMEMBER_EPIPE(spinfo, SOCK_ERRNO == EPIPE);
                        printfPQExpBuffer(&conn->errorMessage,
                    {
                        printfPQExpBuffer(&conn->errorMessage,
                         libpq_gettext("SSL SYSCALL error: EOF detected\n"));
-
+                       /* assume the connection is broken */
                        SOCK_ERRNO_SET(ECONNRESET);
                        n = -1;
                    }
                }
            case SSL_ERROR_SSL:
                {
-                   char       *err = SSLerrmessage();
+                   char       *errm = SSLerrmessage();
 
                    printfPQExpBuffer(&conn->errorMessage,
-                                     libpq_gettext("SSL error: %s\n"), err);
-                   SSLerrfree(err);
+                                     libpq_gettext("SSL error: %s\n"), errm);
+                   SSLerrfree(errm);
+                   /* assume the connection is broken */
+                   SOCK_ERRNO_SET(ECONNRESET);
+                   n = -1;
+                   break;
                }
-               /* fall through */
            case SSL_ERROR_ZERO_RETURN:
+               printfPQExpBuffer(&conn->errorMessage,
+                                 libpq_gettext("SSL connection has been closed unexpectedly\n"));
                SOCK_ERRNO_SET(ECONNRESET);
                n = -1;
                break;
                printfPQExpBuffer(&conn->errorMessage,
                          libpq_gettext("unrecognized SSL error code: %d\n"),
                                  err);
+               /* assume the connection is broken */
+               SOCK_ERRNO_SET(ECONNRESET);
                n = -1;
                break;
        }
 
 /*
  * Write data to a secure connection.
+ *
+ * If SSL is in use, this function is responsible for putting a suitable
+ * message into conn->errorMessage upon error; but the caller does that
+ * when not using SSL.  In either case, caller uses the returned errno
+ * to decide whether to continue/retry after error.
  */
 ssize_t
 pqsecure_write(PGconn *conn, const void *ptr, size_t len)
        switch (err)
        {
            case SSL_ERROR_NONE:
+               if (n < 0)
+               {
+                   printfPQExpBuffer(&conn->errorMessage,
+                                     libpq_gettext("SSL_write failed but did not provide error information\n"));
+                   /* assume the connection is broken */
+                   SOCK_ERRNO_SET(ECONNRESET);
+               }
                break;
            case SSL_ERROR_WANT_READ:
 
                {
                    char        sebuf[256];
 
-                   if (n == -1)
+                   if (n < 0)
                    {
                        REMEMBER_EPIPE(spinfo, SOCK_ERRNO == EPIPE);
                        printfPQExpBuffer(&conn->errorMessage,
                    {
                        printfPQExpBuffer(&conn->errorMessage,
                         libpq_gettext("SSL SYSCALL error: EOF detected\n"));
+                       /* assume the connection is broken */
                        SOCK_ERRNO_SET(ECONNRESET);
                        n = -1;
                    }
                }
            case SSL_ERROR_SSL:
                {
-                   char       *err = SSLerrmessage();
+                   char       *errm = SSLerrmessage();
 
                    printfPQExpBuffer(&conn->errorMessage,
-                                     libpq_gettext("SSL error: %s\n"), err);
-                   SSLerrfree(err);
+                                     libpq_gettext("SSL error: %s\n"), errm);
+                   SSLerrfree(errm);
+                   /* assume the connection is broken */
+                   SOCK_ERRNO_SET(ECONNRESET);
+                   n = -1;
+                   break;
                }
-               /* fall through */
            case SSL_ERROR_ZERO_RETURN:
+               printfPQExpBuffer(&conn->errorMessage,
+                                 libpq_gettext("SSL connection has been closed unexpectedly\n"));
                SOCK_ERRNO_SET(ECONNRESET);
                n = -1;
                break;
                printfPQExpBuffer(&conn->errorMessage,
                          libpq_gettext("unrecognized SSL error code: %d\n"),
                                  err);
+               /* assume the connection is broken */
+               SOCK_ERRNO_SET(ECONNRESET);
                n = -1;
                break;
        }