summaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-07-21 13:53:54 +0000
committerFelix Fietkau <nbd@openwrt.org>2013-07-21 13:53:54 +0000
commita50c18c632f0c4a9cfe4dc3d5b193dac1d94073a (patch)
tree5b20dfc8381a09649ca95f65d3b1690d0934c5e5 /target
parenta1ec175d7bdaf734c625fa15cc311360227e4f2b (diff)
downloadmtk-20170518-a50c18c632f0c4a9cfe4dc3d5b193dac1d94073a.zip
mtk-20170518-a50c18c632f0c4a9cfe4dc3d5b193dac1d94073a.tar.gz
mtk-20170518-a50c18c632f0c4a9cfe4dc3d5b193dac1d94073a.tar.bz2
kernel: fix crash in act_connmark in 3.9 and 3.10 (fixes #13916, #13876)
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 37493
Diffstat (limited to 'target')
-rw-r--r--target/linux/generic/patches-3.10/621-sched_act_connmark.patch35
-rw-r--r--target/linux/generic/patches-3.9/621-sched_act_connmark.patch35
2 files changed, 46 insertions, 24 deletions
diff --git a/target/linux/generic/patches-3.10/621-sched_act_connmark.patch b/target/linux/generic/patches-3.10/621-sched_act_connmark.patch
index 0393f15..e6c050a 100644
--- a/target/linux/generic/patches-3.10/621-sched_act_connmark.patch
+++ b/target/linux/generic/patches-3.10/621-sched_act_connmark.patch
@@ -1,6 +1,6 @@
--- /dev/null
+++ b/net/sched/act_connmark.c
-@@ -0,0 +1,137 @@
+@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org>
+ *
@@ -81,19 +81,30 @@
+ return TC_ACT_PIPE;
+}
+
-+static int tcf_connmark_init(struct nlattr *nla, struct nlattr *est,
-+ struct tc_action *a, int ovr, int bind)
++static int tcf_connmark_init(struct net *net, struct nlattr *nla,
++ struct nlattr *est, struct tc_action *a,
++ int ovr, int bind)
+{
+ struct tcf_common *pc;
-+
-+ pc = tcf_hash_create(0, est, a, sizeof(*pc), bind,
-+ &connmark_idx_gen, &connmark_hash_info);
-+ if (IS_ERR(pc))
-+ return PTR_ERR(pc);
-+
-+ tcf_hash_insert(pc, &connmark_hash_info);
-+
-+ return ACT_P_CREATED;
++ int ret = 0;
++
++ pc = tcf_hash_check(0, a, bind, &connmark_hash_info);
++ if (!pc) {
++ pc = tcf_hash_create(0, est, a, sizeof(*pc), bind,
++ &connmark_idx_gen, &connmark_hash_info);
++ if (IS_ERR(pc))
++ return PTR_ERR(pc);
++
++ tcf_hash_insert(pc, &connmark_hash_info);
++ ret = ACT_P_CREATED;
++ } else {
++ if (!ovr) {
++ tcf_hash_release(pc, bind, &connmark_hash_info);
++ return -EEXIST;
++ }
++ }
++
++ return ret;
+}
+
+static inline int tcf_connmark_cleanup(struct tc_action *a, int bind)
diff --git a/target/linux/generic/patches-3.9/621-sched_act_connmark.patch b/target/linux/generic/patches-3.9/621-sched_act_connmark.patch
index 0393f15..e6c050a 100644
--- a/target/linux/generic/patches-3.9/621-sched_act_connmark.patch
+++ b/target/linux/generic/patches-3.9/621-sched_act_connmark.patch
@@ -1,6 +1,6 @@
--- /dev/null
+++ b/net/sched/act_connmark.c
-@@ -0,0 +1,137 @@
+@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org>
+ *
@@ -81,19 +81,30 @@
+ return TC_ACT_PIPE;
+}
+
-+static int tcf_connmark_init(struct nlattr *nla, struct nlattr *est,
-+ struct tc_action *a, int ovr, int bind)
++static int tcf_connmark_init(struct net *net, struct nlattr *nla,
++ struct nlattr *est, struct tc_action *a,
++ int ovr, int bind)
+{
+ struct tcf_common *pc;
-+
-+ pc = tcf_hash_create(0, est, a, sizeof(*pc), bind,
-+ &connmark_idx_gen, &connmark_hash_info);
-+ if (IS_ERR(pc))
-+ return PTR_ERR(pc);
-+
-+ tcf_hash_insert(pc, &connmark_hash_info);
-+
-+ return ACT_P_CREATED;
++ int ret = 0;
++
++ pc = tcf_hash_check(0, a, bind, &connmark_hash_info);
++ if (!pc) {
++ pc = tcf_hash_create(0, est, a, sizeof(*pc), bind,
++ &connmark_idx_gen, &connmark_hash_info);
++ if (IS_ERR(pc))
++ return PTR_ERR(pc);
++
++ tcf_hash_insert(pc, &connmark_hash_info);
++ ret = ACT_P_CREATED;
++ } else {
++ if (!ovr) {
++ tcf_hash_release(pc, bind, &connmark_hash_info);
++ return -EEXIST;
++ }
++ }
++
++ return ret;
+}
+
+static inline int tcf_connmark_cleanup(struct tc_action *a, int bind)