From 45ea459e200f5b898ad62061e82caccbfbc21380 Mon Sep 17 00:00:00 2001 From: vraatikka Date: Mon, 19 Aug 2013 17:09:33 +0300 Subject: [PATCH] Check the return value of ioctl in dcb_read. --- server/core/dcb.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/server/core/dcb.c b/server/core/dcb.c index 6ea919421..d43fd0895 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -342,8 +342,33 @@ dcb_read(DCB *dcb, GWBUF **head) { GWBUF *buffer = NULL; int b, n = 0; +int rc = 0; +int eno = 0; - ioctl(dcb->fd, FIONREAD, &b); + rc = ioctl(dcb->fd, FIONREAD, &b); + + if (rc == -1) { + eno = errno; + errno = 0; + skygw_log_write( + LOGFILE_ERROR, + "%lu [dcb_read] Setting FIONREAD for %d failed. " + "errno %d, %s", + pthread_self(), + dcb->fd, + eno , + strerror(eno)); + skygw_log_write( + LOGFILE_TRACE, + "%lu [dcb_read] Setting FIONREAD for %d failed. " + "errno %d, %s", + pthread_self(), + dcb->fd, + eno , + strerror(eno)); + return -1; + } + while (b > 0) { int bufsize = b < MAX_BUFFER_SIZE ? b : MAX_BUFFER_SIZE;