Last active
September 27, 2021 10:08
-
-
Save msizanoen1/36a2853467a9bd34fadc5bb3783fde0f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 656665c6599f94fbe7ca584938a440681079458d Mon Sep 17 00:00:00 2001 | |
From: msizanoen1 <msizanoen@qtmlabs.xyz> | |
Date: Mon, 27 Sep 2021 15:23:20 +0700 | |
Subject: [PATCH] net/ipv6: Fix memory leak in fib6_rule_suppress | |
--- | |
include/net/fib_rules.h | 4 +++- | |
net/core/fib_rules.c | 2 +- | |
net/ipv4/fib_rules.c | 1 + | |
net/ipv6/fib6_rules.c | 4 ++-- | |
4 files changed, 7 insertions(+), 4 deletions(-) | |
diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h | |
index 4b10676c69d1..bd07484ab9dd 100644 | |
--- a/include/net/fib_rules.h | |
+++ b/include/net/fib_rules.h | |
@@ -69,7 +69,7 @@ struct fib_rules_ops { | |
int (*action)(struct fib_rule *, | |
struct flowi *, int, | |
struct fib_lookup_arg *); | |
- bool (*suppress)(struct fib_rule *, | |
+ bool (*suppress)(struct fib_rule *, int, | |
struct fib_lookup_arg *); | |
int (*match)(struct fib_rule *, | |
struct flowi *, int); | |
@@ -218,7 +218,9 @@ INDIRECT_CALLABLE_DECLARE(int fib4_rule_action(struct fib_rule *rule, | |
struct fib_lookup_arg *arg)); | |
INDIRECT_CALLABLE_DECLARE(bool fib6_rule_suppress(struct fib_rule *rule, | |
+ int flags, | |
struct fib_lookup_arg *arg)); | |
INDIRECT_CALLABLE_DECLARE(bool fib4_rule_suppress(struct fib_rule *rule, | |
+ int flags, | |
struct fib_lookup_arg *arg)); | |
#endif | |
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c | |
index 79df7cd9dbc1..1bb567a3b329 100644 | |
--- a/net/core/fib_rules.c | |
+++ b/net/core/fib_rules.c | |
@@ -323,7 +323,7 @@ int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl, | |
if (!err && ops->suppress && INDIRECT_CALL_MT(ops->suppress, | |
fib6_rule_suppress, | |
fib4_rule_suppress, | |
- rule, arg)) | |
+ rule, flags, arg)) | |
continue; | |
if (err != -EAGAIN) { | |
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c | |
index ce54a30c2ef1..364ad3446b2f 100644 | |
--- a/net/ipv4/fib_rules.c | |
+++ b/net/ipv4/fib_rules.c | |
@@ -141,6 +141,7 @@ INDIRECT_CALLABLE_SCOPE int fib4_rule_action(struct fib_rule *rule, | |
} | |
INDIRECT_CALLABLE_SCOPE bool fib4_rule_suppress(struct fib_rule *rule, | |
+ int flags, | |
struct fib_lookup_arg *arg) | |
{ | |
struct fib_result *result = (struct fib_result *) arg->result; | |
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c | |
index 40f3e4f9f33a..dcedfe29d9d9 100644 | |
--- a/net/ipv6/fib6_rules.c | |
+++ b/net/ipv6/fib6_rules.c | |
@@ -267,6 +267,7 @@ INDIRECT_CALLABLE_SCOPE int fib6_rule_action(struct fib_rule *rule, | |
} | |
INDIRECT_CALLABLE_SCOPE bool fib6_rule_suppress(struct fib_rule *rule, | |
+ int flags, | |
struct fib_lookup_arg *arg) | |
{ | |
struct fib6_result *res = arg->result; | |
@@ -294,8 +295,7 @@ INDIRECT_CALLABLE_SCOPE bool fib6_rule_suppress(struct fib_rule *rule, | |
return false; | |
suppress_route: | |
- if (!(arg->flags & FIB_LOOKUP_NOREF)) | |
- ip6_rt_put(rt); | |
+ ip6_rt_put_flags(rt, flags); | |
return true; | |
} | |
-- | |
2.31.1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment