diff --git a/core_updater_list.c b/core_updater_list.c index f7d5110b9f..e19caf8f71 100644 --- a/core_updater_list.c +++ b/core_updater_list.c @@ -330,35 +330,61 @@ bool core_updater_list_get_core( static bool core_updater_list_set_date( core_updater_list_entry_t *entry, const char *date_str) { - struct string_list date_list = {0}; + char *tok, *save; + char *elem0 = NULL; + char *elem1 = NULL; + char *elem2 = NULL; + unsigned list_size = 0; + char *date_str_cpy = NULL; if (!entry || string_is_empty(date_str)) - goto error; + return false; + + date_str_cpy = strdup(date_str); /* Split date string into component values */ - string_list_initialize(&date_list); - if (!string_split_noalloc(&date_list, date_str, "-")) - goto error; + if ((tok = strtok_r(date_str_cpy, "-", &save))) + { + elem0 = strdup(tok); + list_size++; + } + if ((tok = strtok_r(NULL, "-", &save))) + { + elem1 = strdup(tok); + list_size++; + } + if ((tok = strtok_r(NULL, "-", &save))) + { + elem2 = strdup(tok); + list_size++; + } + free(date_str_cpy); /* Date string must have 3 values: * [year] [month] [day] */ - if (date_list.size < 3) - goto error; + if (list_size < 3) + { + if (elem0) + free(elem0); + if (elem1) + free(elem1); + if (elem2) + free(elem2); + + return false; + } /* Convert date string values */ - entry->date.year = string_to_unsigned(date_list.elems[0].data); - entry->date.month = string_to_unsigned(date_list.elems[1].data); - entry->date.day = string_to_unsigned(date_list.elems[2].data); + entry->date.year = string_to_unsigned(elem0); + entry->date.month = string_to_unsigned(elem1); + entry->date.day = string_to_unsigned(elem2); /* Clean up */ - string_list_deinitialize(&date_list); + free(elem0); + free(elem1); + free(elem2); return true; - -error: - string_list_deinitialize(&date_list); - - return false; } /* Parses crc string and adds value to @@ -778,12 +804,13 @@ bool core_updater_list_parse_network_data( const char *data, size_t len) { size_t i; - char *data_buf = NULL; - struct string_list network_core_list = {0}; + char *tok, *save; + unsigned list_size = 0; + char *data_buf = NULL; /* Sanity check */ if (!core_list || string_is_empty(data) || (len < 1)) - goto error; + return false; /* We're populating a list 'from scratch' - remove * any existing entries */ @@ -792,28 +819,26 @@ bool core_updater_list_parse_network_data( /* Input data string is not terminated - have * to copy it to a temporary buffer... */ if (!(data_buf = (char*)malloc((len + 1) * sizeof(char)))) - goto error; + return false; memcpy(data_buf, data, len * sizeof(char)); data_buf[len] = '\0'; + list_size = string_count_occurrences_single_character(data_buf, '\n'); + + if (list_size < 1) + { + free(data_buf); + return false; + } + /* Split network listing request into lines */ - string_list_initialize(&network_core_list); - if (!string_split_noalloc(&network_core_list, data_buf, "\n")) - goto error; - - if (network_core_list.size < 1) - goto error; - - /* Temporary data buffer is no longer required */ - free(data_buf); - data_buf = NULL; - /* Loop over lines */ - for (i = 0; i < network_core_list.size; i++) + for (tok = strtok_r(data_buf, "\n", &save); tok; + tok = strtok_r(NULL, "\n", &save)) { struct string_list network_core_entry_list = {0}; - const char *line = network_core_list.elems[i].data; + const char *line = tok; if (string_is_empty(line)) continue; @@ -835,12 +860,13 @@ bool core_updater_list_parse_network_data( string_list_deinitialize(&network_core_entry_list); } + /* Temporary data buffer is no longer required */ + free(data_buf); + data_buf = NULL; + /* Sanity check */ if (RBUF_LEN(core_list->entries) < 1) - goto error; - - /* Clean up */ - string_list_deinitialize(&network_core_list); + return false; /* Sort completed list */ core_updater_list_qsort(core_list); @@ -849,14 +875,6 @@ bool core_updater_list_parse_network_data( core_list->type = CORE_UPDATER_LIST_TYPE_BUILDBOT; return true; - -error: - string_list_deinitialize(&network_core_list); - - if (data_buf) - free(data_buf); - - return false; } /* Parses a single play feature delivery core