From e0c9bd266cdc1c19b3f729ca16f08e11d630e36c Mon Sep 17 00:00:00 2001 From: Morris Jette <jette@schedmd.com> Date: Thu, 29 Dec 2016 15:27:38 -0700 Subject: [PATCH] Fix several memory leaks reported by Coverity --- src/sprio/opts.c | 19 +++++++++-------- src/squeue/opts.c | 52 +++++++++++++++++++++++++---------------------- src/squeue/sort.c | 35 +++++++++++++++++-------------- 3 files changed, 58 insertions(+), 48 deletions(-) diff --git a/src/sprio/opts.c b/src/sprio/opts.c index 0fa47e7a6e1..0ba950fdcb7 100644 --- a/src/sprio/opts.c +++ b/src/sprio/opts.c @@ -447,29 +447,30 @@ _build_job_list( char* str ) * RET List of UIDs (uint32_t) */ static List -_build_user_list( char* str ) +_build_user_list(char* str) { List my_list; char *user = NULL; char *tmp_char = NULL, *my_user_list = NULL; uid_t uid = (uid_t) 0; - if ( str == NULL) + if (str == NULL) return NULL; - my_list = list_create( NULL ); - my_user_list = xstrdup( str ); - user = strtok_r( my_user_list, ",", &tmp_char ); + my_list = list_create(NULL); + my_user_list = xstrdup(str); + user = strtok_r(my_user_list, ",", &tmp_char); while (user) { - if (uid_from_string (user, &uid) < 0) { - error( "Invalid user: %s\n", user); + if (uid_from_string(user, &uid) < 0) { + error("Invalid user: %s\n", user); } else { - uint32_t *u_tmp = xmalloc( sizeof( uint32_t )); + uint32_t *u_tmp = xmalloc(sizeof( uint32_t )); *u_tmp = (uint32_t) uid; - list_append( my_list, u_tmp ); + list_append(my_list, u_tmp); } user = strtok_r (NULL, ",", &tmp_char); } + xfree(my_user_list); return my_list; } diff --git a/src/squeue/opts.c b/src/squeue/opts.c index 1c93224fdc6..551bad42ade 100644 --- a/src/squeue/opts.c +++ b/src/squeue/opts.c @@ -1789,7 +1789,7 @@ static List _build_str_list(char* str) { List my_list; - char *tok = NULL, *tmp_char = NULL, *my_str = NULL; + char *elem, *tok = NULL, *tmp_char = NULL, *my_str = NULL; if (str == NULL) return NULL; @@ -1797,11 +1797,11 @@ _build_str_list(char* str) my_str = xstrdup(str); tok = strtok_r(my_str, ",", &tmp_char); while (tok) { - list_append(my_list, tok); + elem = xstrdup(tok); + list_append(my_list, elem); tok = strtok_r(NULL, ",", &tmp_char); } - /* NOTE: Do NOT xfree my_list or the elements just added to the - * list will also be freed. */ + xfree(my_str); return my_list; } @@ -1817,22 +1817,22 @@ _build_state_list( char* str ) char *state = NULL, *tmp_char = NULL, *my_state_list = NULL; uint32_t *state_id = NULL; - if ( str == NULL) + if (str == NULL) return NULL; - if ( xstrcasecmp( str, "all" ) == 0 ) + if (xstrcasecmp( str, "all") == 0) return _build_all_states_list (); - my_list = list_create( NULL ); - my_state_list = xstrdup( str ); + my_list = list_create(NULL); + my_state_list = xstrdup(str); state = strtok_r( my_state_list, ",", &tmp_char ); - while (state) - { - state_id = xmalloc( sizeof( uint32_t ) ); - if ( _parse_state( state, state_id ) != SLURM_SUCCESS ) - exit( 1 ); - list_append( my_list, state_id ); - state = strtok_r( NULL, ",", &tmp_char ); + while (state) { + state_id = xmalloc(sizeof(uint32_t)); + if (_parse_state(state, state_id) != SLURM_SUCCESS) + exit(1); + list_append(my_list, state_id); + state = strtok_r(NULL, ",", &tmp_char); } + xfree(my_state_list); return my_list; } @@ -1928,23 +1928,25 @@ _build_user_list( char* str ) char *user = NULL; char *tmp_char = NULL, *my_user_list = NULL; - if ( str == NULL ) + if (str == NULL) return NULL; - my_list = list_create( NULL ); - my_user_list = xstrdup( str ); - user = strtok_r( my_user_list, ",", &tmp_char ); + + my_list = list_create(NULL); + my_user_list = xstrdup(str); + user = strtok_r(my_user_list, ",", &tmp_char); while (user) { uid_t some_uid; - if ( uid_from_string( user, &some_uid ) == 0 ) { + if (uid_from_string(user, &some_uid) == 0) { uint32_t *user_id = NULL; - user_id = xmalloc( sizeof( uint32_t )); + user_id = xmalloc(sizeof(uint32_t)); *user_id = (uint32_t) some_uid; - list_append( my_list, user_id ); + list_append(my_list, user_id); } else { - error( "Invalid user: %s\n", user); + error("Invalid user: %s\n", user); } - user = strtok_r (NULL, ",", &tmp_char); + user = strtok_r(NULL, ",", &tmp_char); } + xfree(my_user_list); return my_list; } @@ -2029,9 +2031,11 @@ _check_node_names(hostset_t names) while ((host = hostlist_next(itr))) { if (!_find_a_host(host, node_info)) { error("Invalid node name %s", host); + free(host); hostlist_iterator_destroy(itr); return false; } + free(host); } hostlist_iterator_destroy(itr); diff --git a/src/squeue/sort.c b/src/squeue/sort.c index 76c72d5d499..3e3143581a0 100644 --- a/src/squeue/sort.c +++ b/src/squeue/sort.c @@ -869,6 +869,7 @@ static int _sort_step_by_node_list(void *void1, void *void2) hostlist_t hostlist1, hostlist2; char *val1, *val2; + char *ptr1, *ptr2; #if PURE_ALPHA_SORT == 0 int inx; #endif @@ -878,40 +879,44 @@ static int _sort_step_by_node_list(void *void1, void *void2) hostlist1 = hostlist_create(step1->nodes); hostlist_sort(hostlist1); val1 = hostlist_shift(hostlist1); - if (val1 == NULL) - val1 = ""; + if (val1) + ptr1 = val1; + else + ptr1 = ""; hostlist_destroy(hostlist1); hostlist2 = hostlist_create(step2->nodes); hostlist_sort(hostlist2); val2 = hostlist_shift(hostlist2); - if (val2 == NULL) - val2 = ""; + if (val2) + ptr2 = val2; + else + ptr2 = ""; hostlist_destroy(hostlist2); #if PURE_ALPHA_SORT - diff = xstrcmp(val1, val2); + diff = xstrcmp(ptr1, ptr2); #else - for (inx=0; ; inx++) { - if (val1[inx] == val2[inx]) { - if (val1[inx] == '\0') + for (inx = 0; ; inx++) { + if (ptr1[inx] == ptr2[inx]) { + if (ptr1[inx] == '\0') break; continue; } - if ((isdigit((int)val1[inx])) && - (isdigit((int)val2[inx]))) { + if ((isdigit((int)ptr1[inx])) && + (isdigit((int)ptr2[inx]))) { int num1, num2; - num1 = atoi(val1+inx); - num2 = atoi(val2+inx); + num1 = atoi(ptr1 + inx); + num2 = atoi(ptr2 + inx); diff = num1 - num2; } else - diff = xstrcmp(val1, val2); + diff = xstrcmp(ptr1, ptr2); break; } #endif - if (strlen(val1)) + if (val1) free(val1); - if (strlen(val2)) + if (val2) free(val2); if (reverse_order) -- GitLab