Fixed SSL_accept failing when more data was in the socket buffer than was used.
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user