diff mod_firewall/mod_firewall.lua @ 2070:2356114ff505

mod_firewall: Optimize string match operations, string.find is faster than .match since no string is returned
author Kim Alvefur <zash@zash.se>
date Fri, 11 Mar 2016 18:13:53 +0100
parents 7dbde05b48a9
children d2ad556dcfb7
line wrap: on
line diff
--- a/mod_firewall/mod_firewall.lua	Thu Mar 10 19:00:04 2016 +0100
+++ b/mod_firewall/mod_firewall.lua	Fri Mar 11 18:13:53 2016 +0100
@@ -166,7 +166,7 @@
 		end
 		line_no = line_no + 1;
 
-		if line_hold or line:match("^[#;]") then
+		if line_hold or line:find("^[#;]") then
 			-- No action; comment or partial line
 		elseif line == "" then
 			if state == "rules" then
@@ -174,7 +174,7 @@
 					:format(line_no);
 			end
 			state = nil;
-		elseif not(state) and line:match("^::") then
+		elseif not(state) and line:sub(1, 2) == "::" then
 			chain = line:gsub("^::%s*", "");
 			local chain_info = chains[chain];
 			if not chain_info then
@@ -183,7 +183,7 @@
 				return nil, errmsg("Only event chains supported at the moment");
 			end
 			ruleset[chain] = ruleset[chain] or {};
-		elseif not(state) and line:match("^%%") then -- Definition (zone, limit, etc.)
+		elseif not(state) and line:sub(1,1) == "%" then -- Definition (zone, limit, etc.)
 			local what, name = line:match("^%%%s*(%w+) +([^ :]+)");
 			if not definition_handlers[what] then
 				return nil, errmsg("Definition of unknown object: "..what);
@@ -192,7 +192,7 @@
 			end
 
 			local val = line:match(": ?(.*)$");
-			if not val and line:match(":<") then -- Read from file
+			if not val and line:find(":<") then -- Read from file
 				local fn = line:match(":< ?(.-)%s*$");
 				if not fn then
 					return nil, errmsg("Unable to parse filename");
@@ -214,7 +214,7 @@
 				active_definitions[what] = {};
 			end
 			active_definitions[what][name] = ret;
-		elseif line:match("^[^%s:]+[%.=]") then
+		elseif line:find("^[^%s:]+[%.=]") then
 			-- Action
 			if state == nil then
 				-- This is a standalone action with no conditions
@@ -247,7 +247,7 @@
 			-- Check standard modifiers for the condition (e.g. NOT)
 			local negated;
 			local condition = line:match("^[^:=%.]*");
-			if condition:match("%f[%w]NOT%f[^%w]") then
+			if condition:find("%f[%w]NOT%f[^%w]") then
 				local s, e = condition:match("%f[%w]()NOT()%f[^%w]");
 				condition = (condition:sub(1,s-1)..condition:sub(e+1, -1)):match("^%s*(.-)%s*$");
 				negated = true;
@@ -281,7 +281,7 @@
 		-- chain (filter-based will be added later)
 		for _, rule in ipairs(rules) do
 			for _, condition in ipairs(rule.conditions) do
-				if condition:match("^not%(.+%)$") then
+				if condition:find("^not%(.+%)$") then
 					condition = condition:match("^not%((.+)%)$");
 				end
 				condition_uses[condition] = (condition_uses[condition] or 0) + 1;
@@ -376,7 +376,7 @@
 						for _, event_name in ipairs(chain_definition) do
 							module:hook(event_name, handler, chain_definition.priority);
 						end
-					elseif not chain:match("^user/") then
+					elseif not chain:sub(1, 5) == "user/" then
 						module:log("warn", "Unknown chain %q", chain);
 					end
 					module:hook("firewall/chains/"..chain, handler);