Fixed queries getting stuck when the SSL records were of the maximum allowed size.

This commit is contained in:
Markus Makela 2015-06-05 11:00:51 +03:00
parent cc1f720ea3
commit e83799648a
3 changed files with 48 additions and 40 deletions

View File

@ -898,7 +898,7 @@ int dcb_read_SSL(
GWBUF **head)
{
GWBUF *buffer = NULL;
int b;
int b,pending;
int rc;
int n;
int nread = 0;
@ -918,9 +918,9 @@ int dcb_read_SSL(
while (true)
{
int bufsize;
int ssl_errno = 0;
rc = ioctl(dcb->fd, FIONREAD, &b);
pending = SSL_pending(dcb->ssl);
if (rc == -1)
{
LOGIF(LE, (skygw_log_write_flush(
@ -936,7 +936,7 @@ int dcb_read_SSL(
goto return_n;
}
if (b == 0 && nread == 0)
if (b == 0 && pending == 0 && nread == 0)
{
/** Handle closed client socket */
if (dcb_isclient(dcb))
@ -948,14 +948,20 @@ int dcb_read_SSL(
r = SSL_peek(dcb->ssl, &c, sizeof(char));
if (r <= 0)
{
ssl_errno = SSL_get_error(dcb->ssl,r);
if(ssl_errno != SSL_ERROR_WANT_READ &&
ssl_errno != SSL_ERROR_WANT_WRITE &&
ssl_errno != SSL_ERROR_NONE)
{
n = -1;
goto return_n;
}
goto return_n;
}
}
n = 0;
goto return_n;
}
else if (b == 0)
else if (b == 0 && pending == 0)
{
n = 0;
goto return_n;
@ -984,39 +990,36 @@ int dcb_read_SSL(
goto return_n;
}
int npending;
n = 0;
do
{
n += SSL_read(dcb->ssl, GWBUF_DATA(buffer), bufsize);
n = SSL_read(dcb->ssl, GWBUF_DATA(buffer), bufsize);
dcb->stats.n_reads++;
}while((npending = SSL_pending(dcb->ssl)) > 0);
int ssl_errno = 0;
if (n <= 0)
{
ssl_errno = ERR_get_error();
if(ssl_errno != SSL_ERROR_WANT_READ && ssl_errno != SSL_ERROR_NONE)
if (n <= 0)
{
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Read failed, dcb %p in state "
"%s fd %d: %s.",
dcb,
STRDCBSTATE(dcb->state),
dcb->fd,
ERR_error_string(ssl_errno,NULL))));
ssl_errno = SSL_get_error(dcb->ssl,n);
gwbuf_free(buffer);
goto return_n;
}
if(ssl_errno != SSL_ERROR_WANT_READ &&
ssl_errno != SSL_ERROR_WANT_WRITE &&
ssl_errno != SSL_ERROR_NONE)
{
char errbuf[200];
ERR_error_string(ssl_errno,errbuf);
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Read failed, dcb %p in state "
"%s fd %d, SSL error %d: %s.",
dcb,
STRDCBSTATE(dcb->state),
dcb->fd,
ssl_errno,
errbuf)));
gwbuf_free(buffer);
goto return_n;
}
}
if(n > 0 && b > 0 && n < b)
{
gwbuf_rtrim(buffer,b - n);
buffer->end = buffer->start + n;
#ifdef SS_DEBUG
LOGIF(LD,(skygw_log_write(LD,"[%lu] SSL: Truncated buffer to correct size from %d to %d bytes.\n",
b,gwbuf_length(buffer))));
LOGIF(LD,
@ -1025,9 +1028,7 @@ int dcb_read_SSL(
}
);
ss_dassert(GWBUF_LENGTH(buffer) == n);
}
#endif
nread += n;
LOGIF(LD, (skygw_log_write(
@ -1039,11 +1040,19 @@ int dcb_read_SSL(
dcb,
STRDCBSTATE(dcb->state),
dcb->fd)));
/*< Append read data to the gwbuf */
*head = gwbuf_append(*head, buffer);
if(ssl_errno == SSL_ERROR_WANT_READ || ssl_errno == SSL_ERROR_NONE ||
ssl_errno == SSL_ERROR_WANT_X509_LOOKUP || SSL_ERROR_WANT_WRITE)
rc = ioctl(dcb->fd, FIONREAD, &b);
pending = SSL_pending(dcb->ssl);
if(ssl_errno == SSL_ERROR_WANT_READ ||
ssl_errno == SSL_ERROR_WANT_WRITE ||
(b == 0 && pending == 0))
{
break;
}
} /*< while (true) */
return_n:
return n;

View File

@ -1875,7 +1875,6 @@ int serviceInitSSL(SERVICE* service)
}
service->ctx = SSL_CTX_new(service->method);
SSL_CTX_set_read_ahead(service->ctx,1);
if (SSL_CTX_use_certificate_file(service->ctx, service->ssl_cert, SSL_FILETYPE_PEM) <= 0) {
skygw_log_write(LE,"Error: Failed to set server SSL certificate.");
return -1;

View File

@ -789,7 +789,7 @@ int gw_read_client_event(
nbytes_read = gwbuf_length(dcb->dcb_readqueue);
data = (uint8_t *)GWBUF_DATA(dcb->dcb_readqueue);
int plen = MYSQL_GET_PACKET_LEN(data);
if (nbytes_read < 3 || nbytes_read < MYSQL_GET_PACKET_LEN(data))
if (nbytes_read < 3 || nbytes_read < MYSQL_GET_PACKET_LEN(data) + 4)
{
rc = 0;
goto return_rc;