From 17f87e29af3f8c6336f8e9e6f5a6cd857b9348a2 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Wed, 5 Nov 2014 11:57:42 +0200 Subject: [PATCH] Fixes to some Coverity issues. --- client/maxadmin.c | 4 +++- log_manager/test/testorder.c | 8 +++++-- .../test/canonical_tests/canonizer.c | 2 +- query_classifier/test/classify.c | 6 +++--- server/core/adminusers.c | 21 +++++++++++++------ server/core/buffer.c | 6 ++++-- server/core/config.c | 15 ++++++++++++- server/core/gateway.c | 7 ++++++- 8 files changed, 52 insertions(+), 17 deletions(-) diff --git a/client/maxadmin.c b/client/maxadmin.c index 45e010bb3..b1d29ce3a 100644 --- a/client/maxadmin.c +++ b/client/maxadmin.c @@ -184,7 +184,8 @@ char c; } cmd = malloc(len); - strcpy(cmd, argv[optind]); + int arglen; + memcpy(cmd, argv[optind], (arglen = strlen(argv[optind])) < 8192 ? arglen : 8192); for (i = optind +1; i < argc; i++) { strcat(cmd, " "); strcat(cmd, argv[i]); @@ -317,6 +318,7 @@ int keepalive = 1; { fprintf(stderr, "Unable to connect to MaxScale at %s, %s: %s\n", hostname, port, strerror(errno)); + close(so); return -1; } if (setsockopt(so, SOL_SOCKET, diff --git a/log_manager/test/testorder.c b/log_manager/test/testorder.c index 4dbad0833..047e57966 100644 --- a/log_manager/test/testorder.c +++ b/log_manager/test/testorder.c @@ -78,7 +78,12 @@ int main(int argc, char** argv) for(i = 0;i 8192){ + fprintf(stderr,"Error: Message too long"); + break; + } + memset(message + strlen(message), ' ', msgsize); memset(message + block_size - 1,'\0',1); if(interval > 0 && i % interval == 0){ err = skygw_log_write_flush(LOGFILE_ERROR, message); @@ -90,7 +95,6 @@ int main(int argc, char** argv) break; } usleep(100); - //printf("%s\n",message); } skygw_log_flush(LOGFILE_ERROR); diff --git a/query_classifier/test/canonical_tests/canonizer.c b/query_classifier/test/canonical_tests/canonizer.c index 5116aa4d4..223f91f2a 100644 --- a/query_classifier/test/canonical_tests/canonizer.c +++ b/query_classifier/test/canonical_tests/canonizer.c @@ -62,7 +62,7 @@ int main(int argc, char** argv) *(qbuff->sbuf->data + 1) = (unsigned char)(psize>>8); *(qbuff->sbuf->data + 2) = (unsigned char)(psize>>16); *(qbuff->sbuf->data + 4) = 0x03; - strcpy((char*)(qbuff->start + 5),readbuff); + memcpy(qbuff->start + 5,readbuff,psize + 1); parse_query(qbuff); tok = skygw_get_canonical(qbuff); fprintf(outfile,"%s\n",tok); diff --git a/query_classifier/test/classify.c b/query_classifier/test/classify.c index 4fe33a68b..0555844c9 100644 --- a/query_classifier/test/classify.c +++ b/query_classifier/test/classify.c @@ -45,8 +45,8 @@ int main(int argc, char** argv) input = fopen(argv[1],"rb"); expected = fopen(argv[2],"rb"); - - while((rd = fread(buffer,sizeof(char),buffsz,input))){ + memset(buffer,0,buffsz); + while((rd = fread(buffer,sizeof(char),buffsz - 1,input))){ /**Fill the read buffer*/ if(strsz + rd >= buffsz){ @@ -167,7 +167,7 @@ int main(int argc, char** argv) gwbuf_free(buff); } - + memset(buffer,0,buffsz); } fclose(input); fclose(expected); diff --git a/server/core/adminusers.c b/server/core/adminusers.c index e547a1ff5..43bfac7fd 100644 --- a/server/core/adminusers.c +++ b/server/core/adminusers.c @@ -116,10 +116,12 @@ char fname[1024], *home; char uname[80], passwd[80]; initialise(); - if ((home = getenv("MAXSCALE_HOME")) != NULL) + if ((home = getenv("MAXSCALE_HOME")) != NULL && strlen(home) < 1024){ sprintf(fname, "%s/etc/passwd", home); - else + } + else{ sprintf(fname, "/usr/local/skysql/MaxScale/etc/passwd"); + } if ((fp = fopen(fname, "r")) == NULL) return NULL; if ((rval = users_alloc()) == NULL) @@ -150,10 +152,12 @@ FILE *fp; char fname[1024], *home, *cpasswd; initialise(); - if ((home = getenv("MAXSCALE_HOME")) != NULL) + if ((home = getenv("MAXSCALE_HOME")) != NULL && strlen(home) < 1024){ sprintf(fname, "%s/etc/passwd", home); - else + } + else{ sprintf(fname, "/usr/local/skysql/MaxScale/etc/passwd"); + } if (users == NULL) { @@ -246,7 +250,7 @@ char* admin_remove_user( /** * Open passwd file and remove user from the file. */ - if ((home = getenv("MAXSCALE_HOME")) != NULL) { + if ((home = getenv("MAXSCALE_HOME")) != NULL && strlen(home) < 1024) { sprintf(fname, "%s/etc/passwd", home); sprintf(fname_tmp, "%s/etc/passwd_tmp", home); } else { @@ -310,7 +314,12 @@ char* admin_remove_user( * Unmatching lines are copied to tmp file. */ if (strncmp(uname, fusr, strlen(uname)+1) != 0) { - fsetpos(fp, &rpos); /** one step back */ + if(fsetpos(fp, &rpos) != 0){ /** one step back */ + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "Error : Unable to set stream position. "))); + + } fgets(line, LINELEN, fp); fputs(line, fp_tmp); } diff --git a/server/core/buffer.c b/server/core/buffer.c index dceb171ce..8cbac2d65 100644 --- a/server/core/buffer.c +++ b/server/core/buffer.c @@ -517,8 +517,10 @@ void* gwbuf_get_buffer_object_data( } /** Unlock */ spinlock_release(&buf->gwbuf_lock); - - return bo->bo_data; + if(bo){ + return bo->bo_data; + } + return NULL; } /** diff --git a/server/core/config.c b/server/core/config.c index 181b009fc..4ee39fcb2 100644 --- a/server/core/config.c +++ b/server/core/config.c @@ -461,6 +461,7 @@ int error_count = 0; if (!succp) { + if(param){ LOGIF(LM, (skygw_log_write( LOGFILE_MESSAGE, "* Warning : invalid value type " @@ -470,6 +471,12 @@ int error_count = 0; ((SERVICE*)obj->element)->name, param->name, param->value))); + }else{ + LOGIF(LE, (skygw_log_write( + LOGFILE_ERROR, + "Error : parameter was NULL"))); + + } } } } /*< if (rw_split) */ @@ -1306,6 +1313,7 @@ SERVER *server; if (!succp) { + if(param){ LOGIF(LM, (skygw_log_write( LOGFILE_MESSAGE, "* Warning : invalid value type " @@ -1315,6 +1323,11 @@ SERVER *server; ((SERVICE*)obj->element)->name, param->name, param->value))); + }else{ + LOGIF(LE, (skygw_log_write( + LOGFILE_ERROR, + "Error : parameter was NULL"))); + } } } } @@ -1346,7 +1359,7 @@ SERVER *server; serviceSetUser(obj->element, user, auth); - if (enable_root_user) + if (enable_root_user && service) serviceEnableRootUser(service, atoi(enable_root_user)); if (allow_localhost_match_wildcard_host) diff --git a/server/core/gateway.c b/server/core/gateway.c index 16ea7c7c4..8f0c6d705 100644 --- a/server/core/gateway.c +++ b/server/core/gateway.c @@ -1521,7 +1521,12 @@ int main(int argc, char **argv) * machine. */ sprintf(datadir, "%s/data%d", home_dir, getpid()); - mkdir(datadir, 0777); + if(mkdir(datadir, 0777) != 0){ + LOGIF(LE,(skygw_log_write_flush( + LOGFILE_ERROR, + "Error : Directory creation failed due to %s.", + strerror(errno)))); + } if (!daemon_mode) {