Re: PATCH SSL_pending() checks in libpq/fe-misc.c - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: PATCH SSL_pending() checks in libpq/fe-misc.c
Date
Msg-id 200206112239.g5BMddG25054@candle.pha.pa.us
Whole thread Raw
In response to PATCH SSL_pending() checks in libpq/fe-misc.c  (Jack Bates <pgsql@floatingdoghead.net>)
List pgsql-hackers
Would you send over a context diff, diff -c?


---------------------------------------------------------------------------

Jack Bates wrote:
> 
> Hello:
> 
> I took a look at the SSL code in libpq/fe-misc.c and noticed what I 
> think is a small problem.  A patch is included at the bottom of this 
> email against anoncvs TopOfTree this evening.
> 
> The SSL library buffers input data internally.  Nowhere in libpq's code 
> is this buffer being checked via SSL_pending(), which can lead to a 
> condition where once in a while a socket appears to "hang" or "lag". 
>  This is because select() won't see bytes buffered by the library.  A 
> condition like this is most likely to occur when the library's read 
> buffer has been filled previously and another read is to be performed. 
>  If the end of the backend's transmission was less than one SSL frame 
> payload away from the last byte returned in the previous read, this will 
> likely hang.  Trust me that I learned of this most painfully...  
> 
> I am looking deeper at how to enable non-blocking SSL sockets in libpq. 
>  As Tom Lane states, this is primarily a matter of checking SSL error 
> codes, particularly for SSL_WANT_READ and SSL_WANT_WRITE, and reacting 
> appropriately.  I'll see about that as I have more free time.
> 
> Even though I'm doing this, I tend to agree with Tom that SSH tunnels 
> are a really good way to make the whole SSL problem just go away.
> 
> My quick patch to perform the SSL_pending() checks:
> 
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v
> retrieving revision 1.70
> diff -r1.70 fe-misc.c
> 350a351
>  >  * -or- if SSL is enabled and used, is it buffering bytes?
> 361a363,371
>  > /* Check for SSL library buffering read bytes */
>  > #ifdef USE_SSL
>  >       if (conn->ssl && SSL_pending(conn->ssl) > 0)
>  >       {
>  >               /* short-circuit the select */
>  >               return 1;
>  >       }
>  > #endif
>  >
> 784a795,797
>  >  * If SSL enabled and used and forRead, buffered bytes short-circuit the
>  >  * call to select().
>  >  *
> 801a815,823
>  >
>  > /* Check for SSL library buffering read bytes */
>  > #ifdef USE_SSL
>  >       if (forRead && conn->ssl && SSL_pending(conn->ssl) > 0)
>  >       {
>  >               /* short-circuit the select */
>  >               return 0;
>  >       }
>  > #endif
> 
> _Of_course_ I am just fine with this patch being under a Berkeley-style 
> license and included in PostgreSQL.
> 
> Cheers.
> 
> -- 
> 
> Jack Bates
> Portland, OR, USA
> http://www.floatingdoghead.net
> 
> Got privacy?
> My PGP key: http://www.floatingdoghead.net/pubkey.txt
> 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Schemas and template1
Next
From: Ron Snyder
Date:
Subject: Re: Schemas and template1