@@ -302,6 +302,11 @@ pqsecure_close(PGconn *conn)
302302
303303/*
304304 *Read data from a secure connection.
305+ *
306+ * If SSL is in use, this function is responsible for putting a suitable
307+ * message into conn->errorMessage upon error; but the caller does that
308+ * when not using SSL. In either case, caller uses the returned errno
309+ * to decide whether to continue/retry after error.
305310 */
306311ssize_t
307312pqsecure_read (PGconn * conn ,void * ptr ,size_t len )
@@ -325,6 +330,13 @@ pqsecure_read(PGconn *conn, void *ptr, size_t len)
325330switch (err )
326331{
327332case SSL_ERROR_NONE :
333+ if (n < 0 )
334+ {
335+ printfPQExpBuffer (& conn -> errorMessage ,
336+ libpq_gettext ("SSL_read failed but did not provide error information\n" ));
337+ /* assume the connection is broken */
338+ SOCK_ERRNO_SET (ECONNRESET );
339+ }
328340break ;
329341case SSL_ERROR_WANT_READ :
330342n = 0 ;
@@ -342,7 +354,7 @@ pqsecure_read(PGconn *conn, void *ptr, size_t len)
342354{
343355char sebuf [256 ];
344356
345- if (n == -1 )
357+ if (n < 0 )
346358{
347359REMEMBER_EPIPE (spinfo ,SOCK_ERRNO == EPIPE );
348360printfPQExpBuffer (& conn -> errorMessage ,
@@ -353,29 +365,36 @@ pqsecure_read(PGconn *conn, void *ptr, size_t len)
353365{
354366printfPQExpBuffer (& conn -> errorMessage ,
355367libpq_gettext ("SSL SYSCALL error: EOF detected\n" ));
356-
368+ /* assume the connection is broken */
357369SOCK_ERRNO_SET (ECONNRESET );
358370n = -1 ;
359371}
360372break ;
361373}
362374case SSL_ERROR_SSL :
363375{
364- char * err = SSLerrmessage ();
376+ char * errm = SSLerrmessage ();
365377
366378printfPQExpBuffer (& conn -> errorMessage ,
367- libpq_gettext ("SSL error: %s\n" ),err );
368- SSLerrfree (err );
379+ libpq_gettext ("SSL error: %s\n" ),errm );
380+ SSLerrfree (errm );
381+ /* assume the connection is broken */
382+ SOCK_ERRNO_SET (ECONNRESET );
383+ n = -1 ;
384+ break ;
369385}
370- /* fall through */
371386case SSL_ERROR_ZERO_RETURN :
387+ printfPQExpBuffer (& conn -> errorMessage ,
388+ libpq_gettext ("SSL connection has been closed unexpectedly\n" ));
372389SOCK_ERRNO_SET (ECONNRESET );
373390n = -1 ;
374391break ;
375392default :
376393printfPQExpBuffer (& conn -> errorMessage ,
377394libpq_gettext ("unrecognized SSL error code: %d\n" ),
378395err );
396+ /* assume the connection is broken */
397+ SOCK_ERRNO_SET (ECONNRESET );
379398n = -1 ;
380399break ;
381400}
@@ -391,6 +410,11 @@ pqsecure_read(PGconn *conn, void *ptr, size_t len)
391410
392411/*
393412 *Write data to a secure connection.
413+ *
414+ * If SSL is in use, this function is responsible for putting a suitable
415+ * message into conn->errorMessage upon error; but the caller does that
416+ * when not using SSL. In either case, caller uses the returned errno
417+ * to decide whether to continue/retry after error.
394418 */
395419ssize_t
396420pqsecure_write (PGconn * conn ,const void * ptr ,size_t len )
@@ -412,6 +436,13 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len)
412436switch (err )
413437{
414438case SSL_ERROR_NONE :
439+ if (n < 0 )
440+ {
441+ printfPQExpBuffer (& conn -> errorMessage ,
442+ libpq_gettext ("SSL_write failed but did not provide error information\n" ));
443+ /* assume the connection is broken */
444+ SOCK_ERRNO_SET (ECONNRESET );
445+ }
415446break ;
416447case SSL_ERROR_WANT_READ :
417448
@@ -429,7 +460,7 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len)
429460{
430461char sebuf [256 ];
431462
432- if (n == -1 )
463+ if (n < 0 )
433464{
434465REMEMBER_EPIPE (spinfo ,SOCK_ERRNO == EPIPE );
435466printfPQExpBuffer (& conn -> errorMessage ,
@@ -440,28 +471,36 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len)
440471{
441472printfPQExpBuffer (& conn -> errorMessage ,
442473libpq_gettext ("SSL SYSCALL error: EOF detected\n" ));
474+ /* assume the connection is broken */
443475SOCK_ERRNO_SET (ECONNRESET );
444476n = -1 ;
445477}
446478break ;
447479}
448480case SSL_ERROR_SSL :
449481{
450- char * err = SSLerrmessage ();
482+ char * errm = SSLerrmessage ();
451483
452484printfPQExpBuffer (& conn -> errorMessage ,
453- libpq_gettext ("SSL error: %s\n" ),err );
454- SSLerrfree (err );
485+ libpq_gettext ("SSL error: %s\n" ),errm );
486+ SSLerrfree (errm );
487+ /* assume the connection is broken */
488+ SOCK_ERRNO_SET (ECONNRESET );
489+ n = -1 ;
490+ break ;
455491}
456- /* fall through */
457492case SSL_ERROR_ZERO_RETURN :
493+ printfPQExpBuffer (& conn -> errorMessage ,
494+ libpq_gettext ("SSL connection has been closed unexpectedly\n" ));
458495SOCK_ERRNO_SET (ECONNRESET );
459496n = -1 ;
460497break ;
461498default :
462499printfPQExpBuffer (& conn -> errorMessage ,
463500libpq_gettext ("unrecognized SSL error code: %d\n" ),
464501err );
502+ /* assume the connection is broken */
503+ SOCK_ERRNO_SET (ECONNRESET );
465504n = -1 ;
466505break ;
467506}