static unsigned int nf_ct_expect_hash_rnd __read_mostly;
 static unsigned int nf_ct_expect_count;
+unsigned int nf_ct_expect_max __read_mostly;
 static int nf_ct_expect_hash_rnd_initted __read_mostly;
 static int nf_ct_expect_vmalloc;
 
            master_help->expecting >= master_help->helper->max_expected)
                evict_oldest_expect(master);
 
+       if (nf_ct_expect_count >= nf_ct_expect_max) {
+               if (net_ratelimit())
+                       printk(KERN_WARNING
+                              "nf_conntrack: expectation table full");
+               ret = -EMFILE;
+               goto out;
+       }
+
        nf_ct_expect_insert(expect);
        nf_ct_expect_event(IPEXP_NEW, expect);
        ret = 0;
                if (!nf_ct_expect_hsize)
                        nf_ct_expect_hsize = 1;
        }
+       nf_ct_expect_max = nf_ct_expect_hsize * 4;
 
        nf_ct_expect_hash = nf_ct_alloc_hashtable(&nf_ct_expect_hsize,
                                                  &nf_ct_expect_vmalloc);
 
                .extra1         = &log_invalid_proto_min,
                .extra2         = &log_invalid_proto_max,
        },
-
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "nf_conntrack_expect_max",
+               .data           = &nf_ct_expect_max,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+       },
        { .ctl_name = 0 }
 };