Fixed SSL_accept failing when more data was in the socket buffer than was used.

This commit is contained in:
Markus Makela
2015-06-07 12:37:45 +03:00
parent d19ccc6f84
commit b8e55fe28d

View File

@ -2825,47 +2825,49 @@ int dcb_create_SSL(DCB* dcb)
*/ */
int dcb_accept_SSL(DCB* dcb) int dcb_accept_SSL(DCB* dcb)
{ {
int rval,errnum; int rval = 0,ssl_rval,errnum,fd,b = 0;
char errbuf[140]; char errbuf[140];
rval = SSL_accept(dcb->ssl); fd = dcb->fd;
ioctl(fd,FIONREAD,&b);
while(b > 0 && rval != -1)
{
ssl_rval = SSL_accept(dcb->ssl);
switch(rval) switch(ssl_rval)
{ {
case 0: case 0:
errnum = SSL_get_error(dcb->ssl,rval); errnum = SSL_get_error(dcb->ssl,ssl_rval);
LOGIF(LD,(skygw_log_write_flush(LD,"SSL_accept shutdown for %s@%s", ERR_error_string(errnum,errbuf);
dcb->user, LOGIF(LD,(skygw_log_write_flush(LD,"[%p] SSL_accept shutdown for %s:%s",
dcb->remote))); dcb,
return -1; dcb->remote,
errbuf)));
rval = -1;
break; break;
case 1: case 1:
rval = 1; rval = 1;
LOGIF(LD,(skygw_log_write_flush(LD,"SSL_accept done for %s@%s", LOGIF(LD,(skygw_log_write_flush(LD,"[dcb_accept_SSL] SSL_accept done for %s",
dcb->user,
dcb->remote))); dcb->remote)));
break; break;
case -1: case -1:
errnum = SSL_get_error(dcb->ssl,rval); errnum = SSL_get_error(dcb->ssl,ssl_rval);
if(errnum == SSL_ERROR_WANT_READ || errnum == SSL_ERROR_WANT_WRITE || if(errnum == SSL_ERROR_WANT_READ || errnum == SSL_ERROR_WANT_WRITE)
errnum == SSL_ERROR_WANT_X509_LOOKUP)
{ {
/** Not all of the data has been read. Go back to the poll /** Not all of the data has been read. Go back to the poll
queue and wait for more.*/ queue and wait for more.*/
rval = 0; rval = 0;
LOGIF(LD,(skygw_log_write_flush(LD,"SSL_accept ongoing for %s@%s", LOGIF(LD,(skygw_log_write_flush(LD,"[dcb_accept_SSL] SSL_accept ongoing for %s",
dcb->user?dcb->user:"a connection from ",
dcb->remote))); dcb->remote)));
return rval;
} }
else else
{ {
rval = -1; rval = -1;
ERR_error_string(errnum,errbuf); ERR_error_string(errnum,errbuf);
skygw_log_write_flush(LE, skygw_log_write_flush(LE,
"Error: Fatal error in SSL_accept for %s@%s: (SSL error code: %d) %s", "Error: Fatal error in SSL_accept for %s: (SSL error code: %d) %s",
dcb->user,
dcb->remote, dcb->remote,
errnum, errnum,
errbuf); errbuf);
@ -2875,10 +2877,14 @@ int dcb_accept_SSL(DCB* dcb)
default: default:
skygw_log_write_flush(LE, skygw_log_write_flush(LE,
"Error: Fatal library error in SSL_accept, returned value was %d.", "Error: Fatal library error in SSL_accept, returned value was %d.",
rval); ssl_rval);
rval = -1;
break; break;
} }
ioctl(fd,FIONREAD,&b);
if(LOG_IS_ENABLED(LD) && b > 0)
skygw_log_write_flush(LD,"[dcb_accept_SSL] FD %d has %d bytes ",fd,b);
}
return rval; return rval;
} }