/* seq_file stuff */
        struct proc_dir_entry *pde;
+       const char *name;
        struct net *net;
 
        struct hlist_head hash[0];      /* hashtable itself */
        hinfo->count = 0;
        hinfo->family = family;
        hinfo->rnd_initialized = false;
+       hinfo->name = kstrdup(minfo->name, GFP_KERNEL);
+       if (!hinfo->name) {
+               vfree(hinfo);
+               return -ENOMEM;
+       }
        spin_lock_init(&hinfo->lock);
 
        hinfo->pde = proc_create_data(minfo->name, 0,
                hashlimit_net->ipt_hashlimit : hashlimit_net->ip6t_hashlimit,
                &dl_file_ops, hinfo);
        if (hinfo->pde == NULL) {
+               kfree(hinfo->name);
                vfree(hinfo);
                return -ENOMEM;
        }
                parent = hashlimit_net->ip6t_hashlimit;
 
        if(parent != NULL)
-               remove_proc_entry(hinfo->pde->name, parent);
+               remove_proc_entry(hinfo->name, parent);
 
        htable_selective_cleanup(hinfo, select_all);
+       kfree(hinfo->name);
        vfree(hinfo);
 }
 
        struct xt_hashlimit_htable *hinfo;
 
        hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) {
-               if (!strcmp(name, hinfo->pde->name) &&
+               if (!strcmp(name, hinfo->name) &&
                    hinfo->family == family) {
                        hinfo->use++;
                        return hinfo;
                pde = hashlimit_net->ip6t_hashlimit;
 
        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->ip6t_hashlimit = NULL;