Skip to content

Commit

Permalink
ovs: limit ovs recursions in ovs_execute_actions to not corrupt stack
Browse files Browse the repository at this point in the history
It was seen that defective configurations of openvswitch could overwrite
the STACK_END_MAGIC and cause a hard crash of the kernel because of too
many recursions within ovs.

This problem arises due to the high stack usage of openvswitch. The rest
of the kernel is fine with the current limit of 10 (RECURSION_LIMIT).

We use the already existing recursion counter in ovs_execute_actions to
implement an upper bound of 5 recursions.

Cc: Pravin Shelar <[email protected]>
Cc: Simon Horman <[email protected]>
Cc: Eric Dumazet <[email protected]>
Cc: Simon Horman <[email protected]>
Signed-off-by: Hannes Frederic Sowa <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
strssndktn authored and davem330 committed Jan 18, 2016
1 parent 60a6531 commit b064d0d
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions net/openvswitch/actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -1160,17 +1160,26 @@ int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb,
const struct sw_flow_actions *acts,
struct sw_flow_key *key)
{
int level = this_cpu_read(exec_actions_level);
int err;
static const int ovs_recursion_limit = 5;
int err, level;

level = __this_cpu_inc_return(exec_actions_level);
if (unlikely(level > ovs_recursion_limit)) {
net_crit_ratelimited("ovs: recursion limit reached on datapath %s, probable configuration error\n",
ovs_dp_name(dp));
kfree_skb(skb);
err = -ENETDOWN;
goto out;
}

this_cpu_inc(exec_actions_level);
err = do_execute_actions(dp, skb, key,
acts->actions, acts->actions_len);

if (!level)
if (level == 1)
process_deferred_actions(dp);

this_cpu_dec(exec_actions_level);
out:
__this_cpu_dec(exec_actions_level);
return err;
}

Expand Down

0 comments on commit b064d0d

Please sign in to comment.