diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2008-02-10 02:26:53 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-02-10 02:26:53 -0500 |
commit | 954415e33ed6cfa932c13e8c2460bd05e50723b5 (patch) | |
tree | 6587b63b3d5ba528b446eabf1c6af5134e4c3464 /net/sched | |
parent | ed7af3b3501c8c4e3667c89c2c43347bf29ae237 (diff) |
[PKT_SCHED] ematch: tcf_em_destroy robustness
Make the code in tcf_em_tree_destroy more robust and cleaner:
* Don't need to cast pointer to kfree() or avoid passing NULL.
* After freeing the tree, clear the pointer to avoid possible problems
from repeated free.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched')
-rw-r--r-- | net/sched/ematch.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/sched/ematch.c b/net/sched/ematch.c index d421ec728ee7..b29439ddcf71 100644 --- a/net/sched/ematch.c +++ b/net/sched/ematch.c | |||
@@ -409,14 +409,15 @@ void tcf_em_tree_destroy(struct tcf_proto *tp, struct tcf_ematch_tree *tree) | |||
409 | if (em->ops) { | 409 | if (em->ops) { |
410 | if (em->ops->destroy) | 410 | if (em->ops->destroy) |
411 | em->ops->destroy(tp, em); | 411 | em->ops->destroy(tp, em); |
412 | else if (!tcf_em_is_simple(em) && em->data) | 412 | else if (!tcf_em_is_simple(em)) |
413 | kfree((void *) em->data); | 413 | kfree(em->data); |
414 | module_put(em->ops->owner); | 414 | module_put(em->ops->owner); |
415 | } | 415 | } |
416 | } | 416 | } |
417 | 417 | ||
418 | tree->hdr.nmatches = 0; | 418 | tree->hdr.nmatches = 0; |
419 | kfree(tree->matches); | 419 | kfree(tree->matches); |
420 | tree->matches = NULL; | ||
420 | } | 421 | } |
421 | EXPORT_SYMBOL(tcf_em_tree_destroy); | 422 | EXPORT_SYMBOL(tcf_em_tree_destroy); |
422 | 423 | ||