+}
diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
new file mode 100644
-index 0000000..ffdf76f
+index 0000000..4a4f3f9
--- /dev/null
+++ b/net/netfilter/xt_layer7.c
-@@ -0,0 +1,671 @@
+@@ -0,0 +1,682 @@
+/*
+ Kernel module to match application layer (OSI layer 7) data in connections.
+
+ /* the return value gets checked later, when we're ready to use it */
+ comppattern = compile_and_cache(info->pattern, info->protocol);
+
-+ /* On fist packet of a connection, allocate space for app data */
-+ if(master_conntrack->layer7.packets==0 && !skb->layer7_flags[0] &&
-+ !master_conntrack->layer7.app_data){
++ /* allocate space for app data if not done */
++ if(master_conntrack->layer7.packets < num_packets &&
++ !master_conntrack->layer7.app_data){
+ master_conntrack->layer7.app_data =
+ kmalloc(maxdatalen, GFP_ATOMIC);
+ if(!master_conntrack->layer7.app_data){
+ master_conntrack->layer7.app_data[0] = '\0';
+ }
+
-+ /* this should not happen */
-+ if(master_conntrack->layer7.app_data == NULL) {
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert; /* unmatched */
-+ }
-+
+ if(!skb->layer7_flags[0]){
+ int newbytes;
++ master_conntrack->layer7.packets++;
+ newbytes = add_data(master_conntrack, app_data, appdatalen);
+ if(newbytes == 0) { /* didn't add any data */
+ skb->layer7_flags[0] = 1;
+ spin_unlock_bh(&l7_lock);
+ return info->invert;
+ }
-+ master_conntrack->layer7.packets++;
+ }
+
+ /* If looking for "unknown", then never match. "Unknown" means that
+
+static void __exit xt_layer7_fini(void)
+{
++ struct pattern_cache * node = first_pattern_cache;
++ struct pattern_cache * next = first_pattern_cache;
++
+ remove_proc_entry("layer7_numpackets", init_net.proc_net);
+ xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match));
++
++ /* Free pattern cache at module unload.
++ Important: don't free string cache because conntrack pointers are
++ still points to this strings */
++ spin_lock_bh(&l7_lock);
++ while (node != NULL) {
++ next=node->next;
++ if (node->regex_string!=NULL) kfree(node->regex_string);
++ if (node->pattern!=NULL) kfree(node->pattern);
++ kfree(node);
++ node=next;
++ }
++ spin_unlock_bh(&l7_lock);
++
+}
+
+module_init(xt_layer7_init);