Fixed dcb_write_SSL being called multiple times on failure.

This commit is contained in:
Markus Makela
2015-06-24 15:05:04 +03:00
parent 484781a463
commit 80d130ef0c

View File

@ -1594,11 +1594,12 @@ dcb_write_SSL(DCB *dcb, GWBUF *queue)
}
#endif /* FAKE_CODE */
qlen = GWBUF_LENGTH(queue);
do
{
w = gw_write_SSL(dcb->ssl, GWBUF_DATA(queue), qlen);
dcb->stats.n_writes++;
if (w < 0)
if (w <= 0)
{
int ssl_errno = SSL_get_error(dcb->ssl,w);
@ -1652,9 +1653,9 @@ dcb_write_SSL(DCB *dcb, GWBUF *queue)
}
}
if (LOG_IS_ENABLED(LOGFILE_ERROR))
if (LOG_IS_ENABLED(LOGFILE_ERROR) && ssl_errno != SSL_ERROR_WANT_WRITE)
{
if (ssl_errno != 0)
if (ssl_errno == -1)
{
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
@ -1667,25 +1668,43 @@ dcb_write_SSL(DCB *dcb, GWBUF *queue)
ssl_errno)));
if(ssl_errno == SSL_ERROR_SSL)
{
while((ssl_errno = ERR_get_error()) != 0)
do
{
char errbuf[140];
ERR_error_string(ssl_errno,errbuf);
skygw_log_write(LE,"%s",errbuf);
}
}while((ssl_errno = ERR_get_error()) != 0);
}
if(ssl_errno == SSL_ERROR_SYSCALL)
{
skygw_log_write(LE,"%d:%s",errno,strerror(errno));
}
}
else if(w == 0)
{
do
{
char errbuf[140];
ERR_error_string(ssl_errno,errbuf);
skygw_log_write(LE,"%s",errbuf);
}while((ssl_errno = ERR_get_error()) != 0);
}
}
if(ssl_errno != SSL_ERROR_WANT_WRITE)
break;
}
}while(w <= 0);
/*
* Pull the number of bytes we have written from
* queue with have.
*/
if(w == -1)
{
while((queue = GWBUF_CONSUME_ALL(queue)));
}
else
{
queue = gwbuf_consume(queue, w);
LOGIF(LD, (skygw_log_write(
LOGFILE_DEBUG,
@ -1696,6 +1715,7 @@ dcb_write_SSL(DCB *dcb, GWBUF *queue)
dcb,
STRDCBSTATE(dcb->state),
dcb->fd)));
}
} /*< while (queue != NULL) */
/*<
* What wasn't successfully written is stored to write queue