>
> > +        for (j = 0; j < 4; j++) {
> > +            struct cpu_core *core;
> > +
> > +            core = CONTAINER_OF(hmap_first_with_hash(&all_cpu_cores,
> > +
>  hash_int(core_id++, 0)),
> > +                                struct cpu_core, hmap_node);
> > +            core->available = (bin >> j) & 0x1;
> This can result in NULL pointer deref if cores are not multiple of 4.
> I am not sure how "(bin >> j) & 0x1" works, easier way would be to
> test for bits set in bin and then lookup the core.
>
>

After discussion offline, the "(bin >> j) & 0x1" logic is fine.

To fix the deref of NULL pointer when the number of cores not multiple of 4,
the following change is made:



diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c
index c4a9727..26ab3cf 100644
--- a/lib/ovs-numa.c
+++ b/lib/ovs-numa.c
@@ -328,7 +328,7 @@ ovs_numa_unpin_core(int core_id)

 /* Reads the cpu mask configuration from 'cmask' and sets the
  * 'available' of corresponding cores.  For unspecified cores,
- * sets 'available' to true. */
+ * sets 'available' to false. */
 void
 ovs_numa_set_cpu_mask(const char *cmask)
 {
@@ -370,11 +370,11 @@ ovs_numa_set_cpu_mask(const char *cmask)
                                                      hash_int(core_id++,
0)),
                                 struct cpu_core, hmap_node);
             core->available = (bin >> j) & 0x1;
-       }

-        if (core_id >= hmap_count(&all_cpu_cores)) {
-            return;
-        }
+            if (core_id >= hmap_count(&all_cpu_cores)) {
+                return;
+            }
+       }
     }
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to