Skip to content

Commit

Permalink
net_sched: fix a regression in tcf_proto_lookup_ops()
Browse files Browse the repository at this point in the history
list_for_each_entry(t, &tcf_proto_base, head) doesn't
exit with t = NULL if we reached the end of the list.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Fixes: 3627287 ("net_sched: convert tcf_proto_ops to use struct
list_head")
Cc: Cong Wang <xiyou.wangcong@gmail.com>
Reviewed-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Dec 20, 2013
1 parent 568a153 commit dcd7608
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions net/sched/cls_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,20 @@ static DEFINE_RWLOCK(cls_mod_lock);

static const struct tcf_proto_ops *tcf_proto_lookup_ops(struct nlattr *kind)
{
const struct tcf_proto_ops *t = NULL;
const struct tcf_proto_ops *t, *res = NULL;

if (kind) {
read_lock(&cls_mod_lock);
list_for_each_entry(t, &tcf_proto_base, head) {
if (nla_strcmp(kind, t->kind) == 0) {
if (!try_module_get(t->owner))
t = NULL;
if (try_module_get(t->owner))
res = t;
break;
}
}
read_unlock(&cls_mod_lock);
}
return t;
return res;
}

/* Register(unregister) new classifier type */
Expand Down Expand Up @@ -82,15 +82,13 @@ int unregister_tcf_proto_ops(struct tcf_proto_ops *ops)
int rc = -ENOENT;

write_lock(&cls_mod_lock);
list_for_each_entry(t, &tcf_proto_base, head)
if (t == ops)
list_for_each_entry(t, &tcf_proto_base, head) {
if (t == ops) {
list_del(&t->head);
rc = 0;
break;

if (!t)
goto out;
list_del(&t->head);
rc = 0;
out:
}
}
write_unlock(&cls_mod_lock);
return rc;
}
Expand Down

0 comments on commit dcd7608

Please sign in to comment.