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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to