util/u_queue: fix a use-before-initialization race for queue->threads
authorMarek Olšák <marek.olsak@amd.com>
Wed, 7 Jun 2017 21:13:35 +0000 (23:13 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 7 Jun 2017 21:19:30 +0000 (23:19 +0200)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/util/u_queue.c
src/util/u_queue.h

index 94fe2202a2cff2e68b29ce310e2663dab7e709d7..cb5903014e732e315fff7dd23938332eb2ad64ae 100644 (file)
@@ -147,21 +147,6 @@ util_queue_thread_func(void *input)
       u_thread_setname(name);
    }
 
-   if (queue->flags & UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY) {
-#if defined(__linux__)
-      struct sched_param sched_param = {0};
-
-      /* The nice() function can only set a maximum of 19.
-       * SCHED_IDLE is the same as nice = 20.
-       *
-       * Note that Linux only allows decreasing the priority. The original
-       * priority can't be restored.
-       */
-      pthread_setschedparam(queue->threads[thread_index], SCHED_IDLE,
-                            &sched_param);
-#endif
-   }
-
    while (1) {
       struct util_queue_job job;
 
@@ -220,7 +205,6 @@ util_queue_init(struct util_queue *queue,
    memset(queue, 0, sizeof(*queue));
    queue->name = name;
    queue->num_threads = num_threads;
-   queue->flags = flags;
    queue->max_jobs = max_jobs;
 
    queue->jobs = (struct util_queue_job*)
@@ -259,6 +243,20 @@ util_queue_init(struct util_queue *queue,
             break;
          }
       }
+
+      if (flags & UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY) {
+   #if defined(__linux__)
+         struct sched_param sched_param = {0};
+
+         /* The nice() function can only set a maximum of 19.
+          * SCHED_IDLE is the same as nice = 20.
+          *
+          * Note that Linux only allows decreasing the priority. The original
+          * priority can't be restored.
+          */
+         pthread_setschedparam(queue->threads[i], SCHED_IDLE, &sched_param);
+   #endif
+      }
    }
 
    add_to_atexit_list(queue);
index 916802c96d17062911f90b56fc6ffbdc025d4fea..8ec959814b0e179068290b943e1785334a32dc03 100644 (file)
@@ -71,7 +71,6 @@ struct util_queue {
    thrd_t *threads;
    int num_queued;
    unsigned num_threads;
-   unsigned flags;
    int kill_threads;
    int max_jobs;
    int write_idx, read_idx; /* ring buffer pointers */