[ovs-dev] [PATCH] classifier: Fix race condition leading to NULL dereference.
Jarno Rajahalme
jarno at ovn.org
Sun Apr 17 17:18:28 UTC 2016
> On Apr 16, 2016, at 10:08 PM, Ben Pfaff <blp at ovn.org> wrote:
>
> On Sat, Apr 16, 2016 at 09:28:40PM -0700, Jarno Rajahalme wrote:
>> Addition of table versioning exposed struct cls_rule member
>> 'cls_match' to RCU readers and made it possible for
>> 'cls_match' become NULL while being accessed by an RCU reader, but we failed
>> to check for this condition. This may have resulted in NULL pointer
>> dereference and ovs-vswitchd crash.
>>
>> Fix this by making the 'cls_match' member an RCU pointer and checking
>> the value whenever it potentially read by an RCU reader. In these
>> instances we use ovsrcu_get(), whereas functions accessible only by
>> the exclusive writers use ovsrcu_get_protected() and do not need to
>> check the result.
>>
>> VMware-BZ: 1643642
>> Fixes: 2b7b1427 ("classifier: Support table versioning")
>> Signed-off-by: Jarno Rajahalme <jarno at ovn.org>
>
> Thank you for finding this!
>
> I read the code carefully. I also built it (on top of master) with
> Clang 3.5 and GCC 4.9.1 (for i386), getting clean compiles and no
> warnings from "sparse" either. I also ran the testsuite and it passed.
>
Thanks, I did not have the time last night to do all that!
> I think that most of the changes to classifier.h are just reordering the
> function prototypes. I don't know why this order is being changed.
> Maybe it is to group the comments better? I don't know whether the
> reordering is properly part of a minimal fix (since this will require
> backporting); I'll leave that to your judgment.
>
I wanted it to be clearer which functions are to be called by the exclusive writer only, and which are for the RCU readers. I separated this re-organizing to a separate patch (which need not be backported).
> This new comment in classifier.h could use a space at the end:
>
> /* Classifier rule properties. These are RCU protected and may run
> * concurrently with modifiers and each other.*/
>
Thanks!
> I think that the change to classifier_rule_overlaps() causes it to
> inline cls_rule_visible_in_version(), so that it could be made clearer
> by just calling that function directly.
>
Right, thanks for spotting this.
> The number of instances, with or without _protected, of
> ovsrcu_get(struct cls_match *, &rule->cls_match)
> verges on wanting a pair of helper functions, especially since it would
> probably reduce the amount of line-breaking. Again I leave it to your
> judgment.
>
I added helpers to classifier-private.h so that both classifier.c and test-classifier.c can share them.
> Acked-by: Ben Pfaff <blp at ovn.org <mailto:blp at ovn.org>>
>
Pushed to master, and backported to branches 2.5 and 2.4.
Jarno
> Thanks,
>
> Ben.
More information about the dev
mailing list