Ah-hah, the problem is timing-dependent.  I was able to reproduce it
after I tried connecting from one machine to another.

The patch against 7.3.4 is attached.

                        regards, tom lane

Index: fe-misc.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-misc.c,v
retrieving revision 1.85
diff -c -r1.85 fe-misc.c
*** fe-misc.c   24 Oct 2002 23:35:55 -0000      1.85
--- fe-misc.c   4 Aug 2003 17:22:19 -0000
***************
*** 553,559 ****
--- 553,570 ----
         * file is ready. Grumble.      Fortunately, we don't expect this path to
         * be taken much, since in normal practice we should not be trying to
         * read data unless the file selected for reading already.
+        *
+        * In SSL mode it's even worse: SSL_read() could say WANT_READ and then
+        * data could arrive before we make the pqReadReady() test.  So we must
+        * play dumb and assume there is more data, relying on the SSL layer to
+        * detect true EOF.
         */
+ 
+ #ifdef USE_SSL
+       if (conn->ssl)
+               return 0;
+ #endif
+ 
        switch (pqReadReady(conn))
        {
                case 0:
Index: fe-secure.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-secure.c,v
retrieving revision 1.15.2.5
diff -c -r1.15.2.5 fe-secure.c
*** fe-secure.c 10 Apr 2003 23:03:13 -0000      1.15.2.5
--- fe-secure.c 4 Aug 2003 17:22:19 -0000
***************
*** 278,298 ****
                                                                          
libpq_gettext("SSL SYSCALL error: %s\n"),
                                                                          
SOCK_STRERROR(SOCK_ERRNO));
                                else
                                        printfPQExpBuffer(&conn->errorMessage,
                                                                          
libpq_gettext("SSL SYSCALL error: EOF detected\n"));
                                break;
                        case SSL_ERROR_SSL:
                                printfPQExpBuffer(&conn->errorMessage,
                                          libpq_gettext("SSL error: %s\n"), 
SSLerrmessage());
                                /* fall through */
                        case SSL_ERROR_ZERO_RETURN:
-                               pqsecure_close(conn);
                                SOCK_ERRNO = ECONNRESET;
                                n = -1;
                                break;
                        default:
                                printfPQExpBuffer(&conn->errorMessage,
                                                                  
libpq_gettext("Unknown SSL error code\n"));
                                break;
                }
        }
--- 278,302 ----
                                                                          
libpq_gettext("SSL SYSCALL error: %s\n"),
                                                                          
SOCK_STRERROR(SOCK_ERRNO));
                                else
+                               {
                                        printfPQExpBuffer(&conn->errorMessage,
                                                                          
libpq_gettext("SSL SYSCALL error: EOF detected\n"));
+                                       SOCK_ERRNO = ECONNRESET;
+                                       n = -1;
+                               }
                                break;
                        case SSL_ERROR_SSL:
                                printfPQExpBuffer(&conn->errorMessage,
                                          libpq_gettext("SSL error: %s\n"), 
SSLerrmessage());
                                /* fall through */
                        case SSL_ERROR_ZERO_RETURN:
                                SOCK_ERRNO = ECONNRESET;
                                n = -1;
                                break;
                        default:
                                printfPQExpBuffer(&conn->errorMessage,
                                                                  
libpq_gettext("Unknown SSL error code\n"));
+                               n = -1;
                                break;
                }
        }
***************
*** 334,354 ****
                                                                          
libpq_gettext("SSL SYSCALL error: %s\n"),
                                                                          
SOCK_STRERROR(SOCK_ERRNO));
                                else
                                        printfPQExpBuffer(&conn->errorMessage,
                                                                          
libpq_gettext("SSL SYSCALL error: EOF detected\n"));
                                break;
                        case SSL_ERROR_SSL:
                                printfPQExpBuffer(&conn->errorMessage,
                                          libpq_gettext("SSL error: %s\n"), 
SSLerrmessage());
                                /* fall through */
                        case SSL_ERROR_ZERO_RETURN:
-                               pqsecure_close(conn);
                                SOCK_ERRNO = ECONNRESET;
                                n = -1;
                                break;
                        default:
                                printfPQExpBuffer(&conn->errorMessage,
                                                                  
libpq_gettext("Unknown SSL error code\n"));
                                break;
                }
        }
--- 338,362 ----
                                                                          
libpq_gettext("SSL SYSCALL error: %s\n"),
                                                                          
SOCK_STRERROR(SOCK_ERRNO));
                                else
+                               {
                                        printfPQExpBuffer(&conn->errorMessage,
                                                                          
libpq_gettext("SSL SYSCALL error: EOF detected\n"));
+                                       SOCK_ERRNO = ECONNRESET;
+                                       n = -1;
+                               }
                                break;
                        case SSL_ERROR_SSL:
                                printfPQExpBuffer(&conn->errorMessage,
                                          libpq_gettext("SSL error: %s\n"), 
SSLerrmessage());
                                /* fall through */
                        case SSL_ERROR_ZERO_RETURN:
                                SOCK_ERRNO = ECONNRESET;
                                n = -1;
                                break;
                        default:
                                printfPQExpBuffer(&conn->errorMessage,
                                                                  
libpq_gettext("Unknown SSL error code\n"));
+                               n = -1;
                                break;
                }
        }

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faqs/FAQ.html

Reply via email to