Fixes to Coverity issues 77197 (mysql_common.c, dcb.c, mysql_client.c, skygw_debug.h), 72654 (poll.c), 72756 (mysql_backend.c), 72744 (mysql_backend.c), 77197 (mysql_common.c), 72746 (mysql_common.c), 72676 (mysql_common.c), 72705 (readwritesplit.c), 72697 (readwritesplit.c), 72652 (skygw_debug.h)
This commit is contained in:
@ -509,10 +509,14 @@ bool succp = false;
|
|||||||
pthread_self(),
|
pthread_self(),
|
||||||
dcb->fd,
|
dcb->fd,
|
||||||
dcb)));
|
dcb)));
|
||||||
|
#endif /* SS_DEBUG */
|
||||||
|
#if defined(FAKE_CODE)
|
||||||
conn_open[dcb->fd] = false;
|
conn_open[dcb->fd] = false;
|
||||||
|
#endif /* FAKE_CODE */
|
||||||
|
#if defined(SS_DEBUG)
|
||||||
ss_debug(dcb->fd = -1;)
|
ss_debug(dcb->fd = -1;)
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* SS_DEBUG */
|
||||||
succp = dcb_set_state(dcb, DCB_STATE_DISCONNECTED, NULL);
|
succp = dcb_set_state(dcb, DCB_STATE_DISCONNECTED, NULL);
|
||||||
ss_dassert(succp);
|
ss_dassert(succp);
|
||||||
dcb_next = dcb->memdata.next;
|
dcb_next = dcb->memdata.next;
|
||||||
|
@ -1073,13 +1073,26 @@ double avg1 = 0.0, avg5 = 0.0, avg15 = 0.0;
|
|||||||
{
|
{
|
||||||
char *event_string
|
char *event_string
|
||||||
= event_to_string(thread_data[i].event);
|
= event_to_string(thread_data[i].event);
|
||||||
|
bool from_heap;
|
||||||
|
|
||||||
if (event_string == NULL)
|
if (event_string == NULL)
|
||||||
|
{
|
||||||
|
from_heap = false;
|
||||||
event_string = "??";
|
event_string = "??";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
from_heap = true;
|
||||||
|
}
|
||||||
dcb_printf(dcb,
|
dcb_printf(dcb,
|
||||||
" %2d | %-10s | %6d | %-16p | %s\n",
|
" %2d | %-10s | %6d | %-16p | %s\n",
|
||||||
i, state, thread_data[i].n_fds,
|
i, state, thread_data[i].n_fds,
|
||||||
thread_data[i].cur_dcb, event_string);
|
thread_data[i].cur_dcb, event_string);
|
||||||
free(event_string);
|
|
||||||
|
if (from_heap)
|
||||||
|
{
|
||||||
|
free(event_string);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,6 +270,11 @@ static int gw_read_backend_event(DCB *dcb) {
|
|||||||
|
|
||||||
CHK_SESSION(session);
|
CHK_SESSION(session);
|
||||||
|
|
||||||
|
if (session == NULL)
|
||||||
|
{
|
||||||
|
rc = 0;
|
||||||
|
goto return_with_lock;
|
||||||
|
}
|
||||||
router = session->service->router;
|
router = session->service->router;
|
||||||
router_instance = session->service->router_instance;
|
router_instance = session->service->router_instance;
|
||||||
rsession = session->router_session;
|
rsession = session->router_session;
|
||||||
@ -1165,42 +1170,41 @@ static int backend_write_delayqueue(DCB *dcb)
|
|||||||
|
|
||||||
CHK_SESSION(session);
|
CHK_SESSION(session);
|
||||||
|
|
||||||
router = session->service->router;
|
if (session != NULL)
|
||||||
router_instance = session->service->router_instance;
|
{
|
||||||
rsession = session->router_session;
|
router = session->service->router;
|
||||||
|
router_instance = session->service->router_instance;
|
||||||
|
rsession = session->router_session;
|
||||||
#if defined(SS_DEBUG)
|
#if defined(SS_DEBUG)
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Backend write delayqueue error handling.")));
|
"Backend write delayqueue error handling.")));
|
||||||
#endif
|
#endif
|
||||||
errbuf = mysql_create_custom_error(
|
errbuf = mysql_create_custom_error(
|
||||||
1,
|
1,
|
||||||
0,
|
0,
|
||||||
"Failed to write buffered data to back-end server. "
|
"Failed to write buffered data to back-end server. "
|
||||||
"Buffer was empty or back-end was disconnected during "
|
"Buffer was empty or back-end was disconnected during "
|
||||||
"operation. Attempting to find a new backend.");
|
"operation. Attempting to find a new backend.");
|
||||||
|
|
||||||
router->handleError(router_instance,
|
router->handleError(router_instance,
|
||||||
rsession,
|
rsession,
|
||||||
errbuf,
|
errbuf,
|
||||||
dcb,
|
dcb,
|
||||||
ERRACT_NEW_CONNECTION,
|
ERRACT_NEW_CONNECTION,
|
||||||
&succp);
|
&succp);
|
||||||
gwbuf_free(errbuf);
|
gwbuf_free(errbuf);
|
||||||
|
|
||||||
if (!succp)
|
if (!succp)
|
||||||
{
|
{
|
||||||
if (session != NULL)
|
|
||||||
{
|
|
||||||
spinlock_acquire(&session->ses_lock);
|
spinlock_acquire(&session->ses_lock);
|
||||||
session->state = SESSION_STATE_STOPPING;
|
session->state = SESSION_STATE_STOPPING;
|
||||||
spinlock_release(&session->ses_lock);
|
spinlock_release(&session->ses_lock);
|
||||||
}
|
ss_dassert(dcb->dcb_errhandle_called);
|
||||||
ss_dassert(dcb->dcb_errhandle_called);
|
dcb_close(dcb);
|
||||||
dcb_close(dcb);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1369,8 +1373,8 @@ static GWBUF* process_response_data (
|
|||||||
GWBUF* readbuf,
|
GWBUF* readbuf,
|
||||||
int nbytes_to_process) /*< number of new bytes read */
|
int nbytes_to_process) /*< number of new bytes read */
|
||||||
{
|
{
|
||||||
int npackets_left = 0; /*< response's packet count */
|
int npackets_left = 0; /*< response's packet count */
|
||||||
size_t nbytes_left = 0; /*< nbytes to be read for the packet */
|
size_t nbytes_left = 0; /*< nbytes to be read for the packet */
|
||||||
MySQLProtocol* p;
|
MySQLProtocol* p;
|
||||||
GWBUF* outbuf = NULL;
|
GWBUF* outbuf = NULL;
|
||||||
|
|
||||||
|
@ -1064,9 +1064,9 @@ int gw_MySQLListener(
|
|||||||
strerror(errno));
|
strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#if defined(SS_DEBUG)
|
#if defined(FAKE_CODE)
|
||||||
conn_open[l_so] = true;
|
conn_open[l_so] = true;
|
||||||
#endif
|
#endif /* FAKE_CODE */
|
||||||
listen_dcb->func.accept = gw_MySQLAccept;
|
listen_dcb->func.accept = gw_MySQLAccept;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -1197,8 +1197,10 @@ int gw_MySQLAccept(DCB *listener)
|
|||||||
"%lu [gw_MySQLAccept] Accepted fd %d.",
|
"%lu [gw_MySQLAccept] Accepted fd %d.",
|
||||||
pthread_self(),
|
pthread_self(),
|
||||||
c_sock)));
|
c_sock)));
|
||||||
|
#endif /* SS_DEBUG */
|
||||||
|
#if defined(FAKE_CODE)
|
||||||
conn_open[c_sock] = true;
|
conn_open[c_sock] = true;
|
||||||
#endif
|
#endif /* FAKE_CODE */
|
||||||
/* set nonblocking */
|
/* set nonblocking */
|
||||||
sendbuf = GW_CLIENT_SO_SNDBUF;
|
sendbuf = GW_CLIENT_SO_SNDBUF;
|
||||||
setsockopt(c_sock, SOL_SOCKET, SO_SNDBUF, &sendbuf, optlen);
|
setsockopt(c_sock, SOL_SOCKET, SO_SNDBUF, &sendbuf, optlen);
|
||||||
|
@ -736,13 +736,13 @@ int gw_send_authentication_to_backend(
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int gw_do_connect_to_backend(
|
int gw_do_connect_to_backend(
|
||||||
char *host,
|
char *host,
|
||||||
int port,
|
int port,
|
||||||
int* fd)
|
int *fd)
|
||||||
{
|
{
|
||||||
struct sockaddr_in serv_addr;
|
struct sockaddr_in serv_addr;
|
||||||
int rv;
|
int rv;
|
||||||
int so = 0;
|
int so = 0;
|
||||||
int bufsize;
|
int bufsize;
|
||||||
|
|
||||||
memset(&serv_addr, 0, sizeof serv_addr);
|
memset(&serv_addr, 0, sizeof serv_addr);
|
||||||
@ -750,8 +750,6 @@ int gw_do_connect_to_backend(
|
|||||||
so = socket(AF_INET,SOCK_STREAM,0);
|
so = socket(AF_INET,SOCK_STREAM,0);
|
||||||
|
|
||||||
if (so < 0) {
|
if (so < 0) {
|
||||||
int eno = errno;
|
|
||||||
errno = 0;
|
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Error: Establishing connection to backend server "
|
"Error: Establishing connection to backend server "
|
||||||
@ -759,8 +757,8 @@ int gw_do_connect_to_backend(
|
|||||||
"due %d, %s.",
|
"due %d, %s.",
|
||||||
host,
|
host,
|
||||||
port,
|
port,
|
||||||
eno,
|
errno,
|
||||||
strerror(eno))));
|
strerror(errno))));
|
||||||
rv = -1;
|
rv = -1;
|
||||||
goto return_rv;
|
goto return_rv;
|
||||||
}
|
}
|
||||||
@ -769,29 +767,25 @@ int gw_do_connect_to_backend(
|
|||||||
serv_addr.sin_port = htons(port);
|
serv_addr.sin_port = htons(port);
|
||||||
bufsize = GW_BACKEND_SO_SNDBUF;
|
bufsize = GW_BACKEND_SO_SNDBUF;
|
||||||
|
|
||||||
if(setsockopt(so, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)) != 0)
|
if(setsockopt(so, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)) != 0)
|
||||||
{
|
{
|
||||||
int eno = errno;
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
errno = 0;
|
LOGFILE_ERROR,
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
"Error: Failed to set socket options "
|
||||||
LOGFILE_ERROR,
|
"%s:%d failed.\n\t\t Socket configuration failed "
|
||||||
"Error: Failed to set socket options "
|
"due %d, %s.",
|
||||||
"%s:%d failed.\n\t\t Socket configuration failed "
|
host,
|
||||||
"due %d, %s.",
|
port,
|
||||||
host,
|
errno,
|
||||||
port,
|
strerror(errno))));
|
||||||
eno,
|
rv = -1;
|
||||||
strerror(eno))));
|
/** Close socket */
|
||||||
rv = -1;
|
goto close_so;
|
||||||
goto return_rv;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
bufsize = GW_BACKEND_SO_RCVBUF;
|
bufsize = GW_BACKEND_SO_RCVBUF;
|
||||||
|
|
||||||
if(setsockopt(so, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)) != 0)
|
if(setsockopt(so, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)) != 0)
|
||||||
{
|
{
|
||||||
int eno = errno;
|
|
||||||
errno = 0;
|
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Error: Failed to set socket options "
|
"Error: Failed to set socket options "
|
||||||
@ -799,49 +793,35 @@ int gw_do_connect_to_backend(
|
|||||||
"due %d, %s.",
|
"due %d, %s.",
|
||||||
host,
|
host,
|
||||||
port,
|
port,
|
||||||
eno,
|
errno,
|
||||||
strerror(eno))));
|
strerror(errno))));
|
||||||
rv = -1;
|
rv = -1;
|
||||||
goto return_rv;
|
/** Close socket */
|
||||||
}
|
goto close_so;
|
||||||
|
}
|
||||||
|
|
||||||
/* set socket to as non-blocking here */
|
/* set socket to as non-blocking here */
|
||||||
setnonblocking(so);
|
setnonblocking(so);
|
||||||
rv = connect(so, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
|
rv = connect(so, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
|
||||||
|
|
||||||
if (rv != 0) {
|
if (rv != 0)
|
||||||
int eno = errno;
|
{
|
||||||
errno = 0;
|
if (errno == EINPROGRESS)
|
||||||
|
{
|
||||||
if (eno == EINPROGRESS) {
|
|
||||||
rv = 1;
|
rv = 1;
|
||||||
} else {
|
}
|
||||||
int rc;
|
else
|
||||||
int oldfd = so;
|
{
|
||||||
|
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Error: Failed to connect backend server %s:%d, "
|
"Error: Failed to connect backend server %s:%d, "
|
||||||
"due %d, %s.",
|
"due %d, %s.",
|
||||||
host,
|
host,
|
||||||
port,
|
port,
|
||||||
eno,
|
errno,
|
||||||
strerror(eno))));
|
strerror(errno))));
|
||||||
/*< Close newly created socket. */
|
/** Close socket */
|
||||||
rc = close(so);
|
goto close_so;
|
||||||
|
|
||||||
if (rc != 0) {
|
|
||||||
int eno = errno;
|
|
||||||
errno = 0;
|
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
|
||||||
LOGFILE_ERROR,
|
|
||||||
"Error: Failed to "
|
|
||||||
"close socket %d due %d, %s.",
|
|
||||||
oldfd,
|
|
||||||
eno,
|
|
||||||
strerror(eno))));
|
|
||||||
}
|
|
||||||
goto return_rv;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*fd = so;
|
*fd = so;
|
||||||
@ -853,11 +833,26 @@ int gw_do_connect_to_backend(
|
|||||||
host,
|
host,
|
||||||
port,
|
port,
|
||||||
so)));
|
so)));
|
||||||
#if defined(SS_DEBUG)
|
#if defined(FAKE_CODE)
|
||||||
conn_open[so] = true;
|
conn_open[so] = true;
|
||||||
#endif
|
#endif /* FAKE_CODE */
|
||||||
|
|
||||||
return_rv:
|
return_rv:
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
|
close_so:
|
||||||
|
/*< Close newly created socket. */
|
||||||
|
if (close(so) != 0)
|
||||||
|
{
|
||||||
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
|
LOGFILE_ERROR,
|
||||||
|
"Error: Failed to "
|
||||||
|
"close socket %d due %d, %s.",
|
||||||
|
so,
|
||||||
|
errno,
|
||||||
|
strerror(errno))));
|
||||||
|
}
|
||||||
|
goto return_rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1770,11 +1765,14 @@ void protocol_archive_srv_command(
|
|||||||
{
|
{
|
||||||
p->protocol_cmd_history = server_command_copy(s1);
|
p->protocol_cmd_history = server_command_copy(s1);
|
||||||
}
|
}
|
||||||
else
|
else /*< scan and count history commands */
|
||||||
{
|
{
|
||||||
|
len += 1;
|
||||||
|
|
||||||
while (h1->scom_next != NULL)
|
while (h1->scom_next != NULL)
|
||||||
{
|
{
|
||||||
h1 = h1->scom_next;
|
h1 = h1->scom_next;
|
||||||
|
len += 1;
|
||||||
}
|
}
|
||||||
h1->scom_next = server_command_copy(s1);
|
h1->scom_next = server_command_copy(s1);
|
||||||
}
|
}
|
||||||
@ -2067,7 +2065,7 @@ char* get_username_from_auth(
|
|||||||
|
|
||||||
first_letter = (char *)(data + 4 + 4 + 4 + 1 + 23);
|
first_letter = (char *)(data + 4 + 4 + 4 + 1 + 23);
|
||||||
|
|
||||||
if (first_letter == '\0')
|
if (*first_letter == '\0')
|
||||||
{
|
{
|
||||||
rval = NULL;
|
rval = NULL;
|
||||||
goto retblock;
|
goto retblock;
|
||||||
|
@ -851,7 +851,9 @@ static void* newSession(
|
|||||||
|
|
||||||
rses_end_locked_router_action(client_rses);
|
rses_end_locked_router_action(client_rses);
|
||||||
|
|
||||||
/** Both Master and at least 1 slave must be found */
|
/**
|
||||||
|
* Master and at least <min_nslaves> slaves must be found
|
||||||
|
*/
|
||||||
if (!succp) {
|
if (!succp) {
|
||||||
free(client_rses->rses_backend_ref);
|
free(client_rses->rses_backend_ref);
|
||||||
free(client_rses);
|
free(client_rses);
|
||||||
@ -4101,15 +4103,17 @@ static void handleError (
|
|||||||
}
|
}
|
||||||
session = backend_dcb->session;
|
session = backend_dcb->session;
|
||||||
|
|
||||||
if (session != NULL)
|
if (session == NULL || rses == NULL)
|
||||||
CHK_SESSION(session);
|
{
|
||||||
|
*succp = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CHK_SESSION(session);
|
||||||
|
CHK_CLIENT_RSES(rses);
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case ERRACT_NEW_CONNECTION:
|
case ERRACT_NEW_CONNECTION:
|
||||||
{
|
{
|
||||||
if (rses != NULL)
|
|
||||||
CHK_CLIENT_RSES(rses);
|
|
||||||
|
|
||||||
if (!rses_begin_locked_router_action(rses))
|
if (!rses_begin_locked_router_action(rses))
|
||||||
{
|
{
|
||||||
*succp = false;
|
*succp = false;
|
||||||
|
@ -183,8 +183,7 @@ typedef enum skygw_chk_t {
|
|||||||
((p) == MYSQL_COM_QUIT ? "COM_QUIT" : \
|
((p) == MYSQL_COM_QUIT ? "COM_QUIT" : \
|
||||||
((p) == MYSQL_COM_STMT_PREPARE ? "MYSQL_COM_STMT_PREPARE" : \
|
((p) == MYSQL_COM_STMT_PREPARE ? "MYSQL_COM_STMT_PREPARE" : \
|
||||||
((p) == MYSQL_COM_STMT_EXECUTE ? "MYSQL_COM_STMT_EXECUTE" : \
|
((p) == MYSQL_COM_STMT_EXECUTE ? "MYSQL_COM_STMT_EXECUTE" : \
|
||||||
((p) == MYSQL_COM_UNDEFINED ? "MYSQL_COM_UNDEFINED" : \
|
"UNKNOWN MYSQL PACKET TYPE"))))))))))))))))))
|
||||||
"UNKNOWN MYSQL PACKET TYPE")))))))))))))))))))
|
|
||||||
|
|
||||||
#define STRDCBSTATE(s) ((s) == DCB_STATE_ALLOC ? "DCB_STATE_ALLOC" : \
|
#define STRDCBSTATE(s) ((s) == DCB_STATE_ALLOC ? "DCB_STATE_ALLOC" : \
|
||||||
((s) == DCB_STATE_POLLING ? "DCB_STATE_POLLING" : \
|
((s) == DCB_STATE_POLLING ? "DCB_STATE_POLLING" : \
|
||||||
@ -531,8 +530,8 @@ typedef enum skygw_chk_t {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(SS_DEBUG)
|
#if defined(FAKE_CODE)
|
||||||
bool conn_open[10240];
|
bool conn_open[10240];
|
||||||
#endif
|
#endif /* FAKE_CODE */
|
||||||
|
|
||||||
#endif /* SKYGW_DEBUG_H */
|
#endif /* SKYGW_DEBUG_H */
|
||||||
|
Reference in New Issue
Block a user