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:
VilhoRaatikka
2014-11-11 14:10:06 +02:00
parent 704c69eb40
commit 061fa62d29
7 changed files with 138 additions and 114 deletions

View File

@ -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;

View File

@ -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);
}
} }
} }
} }

View File

@ -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;
@ -1164,43 +1169,42 @@ static int backend_write_delayqueue(DCB *dcb)
SESSION *session = dcb->session; SESSION *session = dcb->session;
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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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 */