From: Adrian Freihofer <adrian.freiho...@siemens.com> Try to make memory management more robust by assigning always NULL to struct ptest_list pointers. It's a refactoring which probably improves the code but does not fix a concrete bug.
Signed-off-by: Adrian Freihofer <adrian.freiho...@siemens.com> --- Changes for v2 [lukma]: - Rebase from origin/dev to origin/master (the dev branch had some adjustments for timeout, which shall be discarded as not needed anymore. --- main.c | 9 +++++---- ptest_list.c | 13 ++++--------- ptest_list.h | 8 +------- tests/ptest_list.c | 13 +++++++------ tests/utils.c | 22 +++++++++++----------- utils.c | 6 +++--- 6 files changed, 31 insertions(+), 40 deletions(-) diff --git a/main.c b/main.c index 2b13ef5..890bc6a 100644 --- a/main.c +++ b/main.c @@ -117,7 +117,8 @@ main(int argc, char *argv[]) mtrace(); #endif - struct ptest_list *head, *run; + struct ptest_list *head = NULL; + struct ptest_list *run = NULL; __attribute__ ((__cleanup__(cleanup_ptest_opts))) struct ptest_options opts; opts.dirs = malloc(sizeof(char **) * 1); @@ -176,7 +177,7 @@ main(int argc, char *argv[]) head = NULL; for (i = 0; i < opts.dirs_no; i ++) { - struct ptest_list *tmp; + struct ptest_list *tmp = NULL; tmp = get_available_ptests(opts.dirs[i]); if (tmp == NULL) { @@ -212,7 +213,7 @@ main(int argc, char *argv[]) run = filter_ptests(head, opts.ptests, ptest_num); CHECK_ALLOCATION(run, (size_t) ptest_num, 1); - ptest_list_free_all(head); + ptest_list_free_all(&head); } for (i = 0; i < ptest_exclude_num; i++) @@ -220,7 +221,7 @@ main(int argc, char *argv[]) rc = run_ptests(run, opts, argv[0], stdout, stderr); - ptest_list_free_all(run); + ptest_list_free_all(&run); return rc; } diff --git a/ptest_list.c b/ptest_list.c index 917ef4f..0c0e5b2 100644 --- a/ptest_list.c +++ b/ptest_list.c @@ -69,24 +69,19 @@ ptest_list_free(struct ptest_list *p) free(p); } -int -ptest_list_free_all(struct ptest_list *head) +void +ptest_list_free_all(struct ptest_list **head) { - int i = 0; struct ptest_list *p, *q; - VALIDATE_PTR_RINT(head); - - p = head; + p = *head; while (p != NULL) { q = p; p = p->next; ptest_list_free(q); - i++; } - - return i; + *head = NULL; } int diff --git a/ptest_list.h b/ptest_list.h index 02a64bb..658a07a 100644 --- a/ptest_list.h +++ b/ptest_list.h @@ -36,12 +36,6 @@ x = NULL; \ } while (0) -#define PTEST_LIST_FREE_ALL_CLEAN(x) \ - do { \ - ptest_list_free_all(x); \ - x = NULL; \ - } while (0) - #define PTEST_LIST_ITERATE_START(head, p) for (p = head->next; p != NULL; p = p->next) { #define PTEST_LIST_ITERATE_END } @@ -57,7 +51,7 @@ struct ptest_list { extern struct ptest_list *ptest_list_alloc(void); extern void ptest_list_free(struct ptest_list *); -extern int ptest_list_free_all(struct ptest_list *); +extern void ptest_list_free_all(struct ptest_list **); extern int ptest_list_length(struct ptest_list *); extern struct ptest_list *ptest_list_search(struct ptest_list *, char *); diff --git a/tests/ptest_list.c b/tests/ptest_list.c index 081f027..fc15acb 100644 --- a/tests/ptest_list.c +++ b/tests/ptest_list.c @@ -53,7 +53,7 @@ START_TEST(test_add) { struct ptest_list *head = ptest_list_alloc(); ck_assert(ptest_list_add(head, strdup("perl"), NULL) != NULL); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST @@ -62,14 +62,15 @@ START_TEST(test_free_all) struct ptest_list *head = NULL; int i; - ck_assert(ptest_list_free_all(head) == -1); + ptest_list_free_all(&head); + ck_assert(head == NULL); ck_assert(errno == EINVAL); head = ptest_list_alloc(); for (i = 0; i < ptests_num; i++) ptest_list_add(head, strdup(ptest_names[i]), NULL); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST @@ -87,7 +88,7 @@ START_TEST(test_length) ptest_list_add(head, strdup(ptest_names[i]), NULL); ck_assert_int_eq(ptest_list_length(head), ptests_num); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST @@ -109,7 +110,7 @@ START_TEST(test_search) for (i = ptests_num - 1; i >= 0; i--) ck_assert(ptest_list_search(head, ptest_names[i]) != NULL); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST @@ -141,7 +142,7 @@ START_TEST(test_remove) ck_assert_int_eq(ptest_list_length(head), n); ck_assert(ptest_list_search(head, "busybox") != NULL); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST diff --git a/tests/utils.c b/tests/utils.c index 8fffc18..0a51cec 100644 --- a/tests/utils.c +++ b/tests/utils.c @@ -88,13 +88,13 @@ START_TEST(test_get_available_ptests) for (i = 0; ptests_not_found[i] != NULL; i++) ck_assert(ptest_list_search(head, ptests_not_found[i]) == NULL); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST START_TEST(test_print_ptests) { - struct ptest_list *head; + struct ptest_list *head = NULL; char *buf; size_t size = PRINT_PTEST_BUF_SIZE; @@ -116,14 +116,14 @@ START_TEST(test_print_ptests) head = ptest_list_alloc(); ck_assert(print_ptests(head, fp) == 1); - ptest_list_free_all(head); + ptest_list_free_all(&head); line = fgets(line_buf, PRINT_PTEST_BUF_SIZE, fp); ck_assert(line != NULL); ck_assert(strcmp(line, PRINT_PTESTS_NOT_FOUND) == 0); head = get_available_ptests(opts_directory); ck_assert(print_ptests(head, fp) == 0); - ptest_list_free_all(head); + ptest_list_free_all(&head); line = fgets(line_buf, PRINT_PTEST_BUF_SIZE, fp); ck_assert(line != NULL); ck_assert(strcmp(line, PRINT_PTESTS_AVAILABLE) == 0); @@ -144,7 +144,7 @@ END_TEST START_TEST(test_filter_ptests) { struct ptest_list *head = get_available_ptests(opts_directory); - struct ptest_list *head_new; + struct ptest_list *head_new = NULL; char *ptest_not_exists[] = { "glib", }; @@ -161,8 +161,8 @@ START_TEST(test_filter_ptests) ck_assert(head_new != NULL); ck_assert(ptest_list_length(head_new) == 3); - ptest_list_free_all(head); - ptest_list_free_all(head_new); + ptest_list_free_all(&head); + ptest_list_free_all(&head_new); } END_TEST @@ -191,7 +191,7 @@ START_TEST(test_run_ptests) rc = run_ptests(head, opts, "test_run_ptests", fp_stdout, fp_stderr); ck_assert(rc == 0); - ptest_list_free_all(head); + ptest_list_free_all(&head); fclose(fp_stdout); free(buf_stdout); @@ -227,7 +227,7 @@ START_TEST(test_run_timeout_duration_ptest) test_ptest_expected_failure(head, timeout, "hang", search_for_timeout_and_duration); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST @@ -255,7 +255,7 @@ START_TEST(test_run_fail_ptest) test_ptest_expected_failure(head, timeout, "fail", search_for_fail); - ptest_list_free_all(head); + ptest_list_free_all(&head); } END_TEST @@ -354,7 +354,7 @@ test_ptest_expected_failure(struct ptest_list *head, const unsigned int timeout, fp_stdout ); - PTEST_LIST_FREE_ALL_CLEAN(filtered); + ptest_list_free_all(&filtered); } fclose(fp_stdout); diff --git a/utils.c b/utils.c index 128ff61..0f80357 100644 --- a/utils.c +++ b/utils.c @@ -92,7 +92,7 @@ check_allocation1(void *p, size_t size, char *file, int line, int exit_on_null) struct ptest_list * get_available_ptests(const char *dir) { - struct ptest_list *head; + struct ptest_list *head = NULL; struct stat st_buf; int n, i; @@ -189,7 +189,7 @@ get_available_ptests(const char *dir) free(namelist); if (fail) { - PTEST_LIST_FREE_ALL_CLEAN(head); + ptest_list_free_all(&head); errno = saved_errno; break; } @@ -257,7 +257,7 @@ filter_ptests(struct ptest_list *head, char **ptests, int ptest_num) } if (fail) { - PTEST_LIST_FREE_ALL_CLEAN(head_new); + ptest_list_free_all(&head_new); errno = saved_errno; } } while (0); -- 2.20.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#54433): https://lists.yoctoproject.org/g/yocto/message/54433 Mute This Topic: https://lists.yoctoproject.org/mt/84946491/21656 Group Owner: yocto+ow...@lists.yoctoproject.org Unsubscribe: https://lists.yoctoproject.org/g/yocto/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-