Commit 14b872f0 authored by Al Viro's avatar Al Viro

xt_hashlimit: allocate a copy of name explicitly, don't rely on procfs guts

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 89b107ad
...@@ -107,6 +107,7 @@ struct xt_hashlimit_htable { ...@@ -107,6 +107,7 @@ struct xt_hashlimit_htable {
/* seq_file stuff */ /* seq_file stuff */
struct proc_dir_entry *pde; struct proc_dir_entry *pde;
const char *name;
struct net *net; struct net *net;
struct hlist_head hash[0]; /* hashtable itself */ struct hlist_head hash[0]; /* hashtable itself */
...@@ -253,6 +254,11 @@ static int htable_create(struct net *net, struct xt_hashlimit_mtinfo1 *minfo, ...@@ -253,6 +254,11 @@ static int htable_create(struct net *net, struct xt_hashlimit_mtinfo1 *minfo,
hinfo->count = 0; hinfo->count = 0;
hinfo->family = family; hinfo->family = family;
hinfo->rnd_initialized = false; hinfo->rnd_initialized = false;
hinfo->name = kstrdup(minfo->name, GFP_KERNEL);
if (!hinfo->name) {
vfree(hinfo);
return -ENOMEM;
}
spin_lock_init(&hinfo->lock); spin_lock_init(&hinfo->lock);
hinfo->pde = proc_create_data(minfo->name, 0, hinfo->pde = proc_create_data(minfo->name, 0,
...@@ -260,6 +266,7 @@ static int htable_create(struct net *net, struct xt_hashlimit_mtinfo1 *minfo, ...@@ -260,6 +266,7 @@ static int htable_create(struct net *net, struct xt_hashlimit_mtinfo1 *minfo,
hashlimit_net->ipt_hashlimit : hashlimit_net->ip6t_hashlimit, hashlimit_net->ipt_hashlimit : hashlimit_net->ip6t_hashlimit,
&dl_file_ops, hinfo); &dl_file_ops, hinfo);
if (hinfo->pde == NULL) { if (hinfo->pde == NULL) {
kfree(hinfo->name);
vfree(hinfo); vfree(hinfo);
return -ENOMEM; return -ENOMEM;
} }
...@@ -330,9 +337,10 @@ static void htable_destroy(struct xt_hashlimit_htable *hinfo) ...@@ -330,9 +337,10 @@ static void htable_destroy(struct xt_hashlimit_htable *hinfo)
parent = hashlimit_net->ip6t_hashlimit; parent = hashlimit_net->ip6t_hashlimit;
if(parent != NULL) if(parent != NULL)
remove_proc_entry(hinfo->pde->name, parent); remove_proc_entry(hinfo->name, parent);
htable_selective_cleanup(hinfo, select_all); htable_selective_cleanup(hinfo, select_all);
kfree(hinfo->name);
vfree(hinfo); vfree(hinfo);
} }
...@@ -344,7 +352,7 @@ static struct xt_hashlimit_htable *htable_find_get(struct net *net, ...@@ -344,7 +352,7 @@ static struct xt_hashlimit_htable *htable_find_get(struct net *net,
struct xt_hashlimit_htable *hinfo; struct xt_hashlimit_htable *hinfo;
hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) { hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) {
if (!strcmp(name, hinfo->pde->name) && if (!strcmp(name, hinfo->name) &&
hinfo->family == family) { hinfo->family == family) {
hinfo->use++; hinfo->use++;
return hinfo; return hinfo;
...@@ -887,7 +895,7 @@ static void __net_exit hashlimit_proc_net_exit(struct net *net) ...@@ -887,7 +895,7 @@ static void __net_exit hashlimit_proc_net_exit(struct net *net)
pde = hashlimit_net->ip6t_hashlimit; pde = hashlimit_net->ip6t_hashlimit;
hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) hlist_for_each_entry(hinfo, &hashlimit_net->htables, node)
remove_proc_entry(hinfo->pde->name, pde); remove_proc_entry(hinfo->name, pde);
hashlimit_net->ipt_hashlimit = NULL; hashlimit_net->ipt_hashlimit = NULL;
hashlimit_net->ip6t_hashlimit = NULL; hashlimit_net->ip6t_hashlimit = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment