Re: PG 7.3.1 with ssl on linux hangs (testcase available)

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: PG 7.3.1 with ssl on linux hangs (testcase available)
Дата
Msg-id 7841.1060018141@sss.pgh.pa.us
обсуждение исходный текст
Ответ на PG 7.3.1 with ssl on linux hangs (testcase available)  (Hans-Jürgen Hay <hjh@alterras.de>)
Список pgsql-bugs
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;
          }
      }

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Pavel Stehule
Дата:
Сообщение: small bug in op + between datetime and integer
Следующее
От: Tom Lane
Дата:
Сообщение: Re: problem with libpq7.3.3/encrypted