[PATCH] ipcpd: Fix cleanup of sdu scheduler

  • From: Dimitri Staessens <dimitri.staessens@xxxxxxxx>
  • To: ouroboros@xxxxxxxxxxxxx
  • Date: Sat, 24 Feb 2018 03:01:05 +0100

Not all threads were cancelled on exit. This fixes (the rather
cryptic) error message "The futex facility returned an unexpected
error code" when running the stack with the address sanitizer.  Also
fixes possible double frees when a pthread_create would fail.

Signed-off-by: Dimitri Staessens <dimitri.staessens@xxxxxxxx>
---
 src/ipcpd/normal/sdu_sched.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/ipcpd/normal/sdu_sched.c b/src/ipcpd/normal/sdu_sched.c
index 0399f4d..d4826ce 100644
--- a/src/ipcpd/normal/sdu_sched.c
+++ b/src/ipcpd/normal/sdu_sched.c
@@ -100,12 +100,12 @@ struct sdu_sched * sdu_sched_create(next_sdu_fn_t 
callback)
         int                 i;
         int                 j;
 
+        assert(callback);
+
         sdu_sched = malloc(sizeof(*sdu_sched));
         if (sdu_sched == NULL)
                 goto fail_malloc;
 
-        assert(callback);
-
         sdu_sched->callback = callback;
 
         for (i = 0; i < QOS_CUBE_MAX; ++i) {
@@ -135,7 +135,9 @@ struct sdu_sched * sdu_sched_create(next_sdu_fn_t callback)
                                 pthread_cancel(sdu_sched->readers[j]);
                         for (j = 0; j < i; ++j)
                                 pthread_join(sdu_sched->readers[j], NULL);
-                        goto fail_pthr;
+                        for (j = i; j < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++j)
+                                free(infos[i]);
+                        goto fail_infos;
                 }
         }
 
@@ -152,6 +154,7 @@ struct sdu_sched * sdu_sched_create(next_sdu_fn_t callback)
 
                 par.sched_priority = min +
                         (qos_prio[i % QOS_CUBE_MAX] * (max - min) / 99);
+
                 if (pthread_setschedparam(sdu_sched->readers[i], pol, &par))
                         goto fail_sched;
         }
@@ -163,9 +166,6 @@ struct sdu_sched * sdu_sched_create(next_sdu_fn_t callback)
                 pthread_cancel(sdu_sched->readers[j]);
         for (j = 0; j < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++j)
                 pthread_join(sdu_sched->readers[j], NULL);
- fail_pthr:
-        for (j = 0; j < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++j)
-                free(infos[j]);
  fail_infos:
         for (j = 0; j < QOS_CUBE_MAX; ++j)
                 fset_destroy(sdu_sched->set[j]);
@@ -181,7 +181,7 @@ void sdu_sched_destroy(struct sdu_sched * sdu_sched)
 
         assert(sdu_sched);
 
-        for (i = 0; i < QOS_CUBE_MAX; ++i) {
+        for (i = 0; i < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++i) {
                 pthread_cancel(sdu_sched->readers[i]);
                 pthread_join(sdu_sched->readers[i], NULL);
         }
-- 
2.16.2


Other related posts:

  • » [PATCH] ipcpd: Fix cleanup of sdu scheduler - Dimitri Staessens