SELinux: use deletion-safe iterator to free list
authorJeff Vander Stoep <jeffv@google.com>
Tue, 21 Apr 2015 00:45:42 +0000 (17:45 -0700)
committerMark Salyzyn <salyzyn@google.com>
Tue, 21 Apr 2015 14:20:30 +0000 (14:20 +0000)
This code is not exercised by policy version 26, but will be upon
upgrade to policy version 30.

Bug: 18087110
Change-Id: I07c6f34607713294a6a12c43a64d9936f0602200
Signed-off-by: Jeff Vander Stoep <jeffv@google.com>
security/selinux/avc.c

index 5c8e7cfa9de395d1192c2cc12fae631ae8705a96..f3dbbc0f15dd5d3988fe639ac1fd5c2b38bf2879 100644 (file)
@@ -298,13 +298,15 @@ static void avc_operation_decision_free(
 
 static void avc_operation_free(struct avc_operation_node *ops_node)
 {
-       struct avc_operation_decision_node *od_node;
+       struct avc_operation_decision_node *od_node, *tmp;
 
        if (!ops_node)
                return;
 
-       list_for_each_entry(od_node, &ops_node->od_head, od_list)
+       list_for_each_entry_safe(od_node, tmp, &ops_node->od_head, od_list) {
+               list_del(&od_node->od_list);
                avc_operation_decision_free(od_node);
+       }
        kmem_cache_free(avc_operation_node_cachep, ops_node);
 }