commit 6bd388a: [Minor] Add flags for rspamd_lua_parse_table_arguments

Vsevolod Stakhov vsevolod at highsecure.ru
Mon Jul 1 10:56:04 UTC 2019


Author: Vsevolod Stakhov
Date: 2019-07-01 11:08:43 +0100
URL: https://github.com/rspamd/rspamd/commit/6bd388ae930900bef74532f810c4411650761868

[Minor] Add flags for rspamd_lua_parse_table_arguments

---
 src/lua/lua_common.c       | 51 ++++++++++++++++++++++++++++++++++++----------
 src/lua/lua_common.h       |  9 +++++++-
 src/lua/lua_config.c       |  6 ++++++
 src/lua/lua_dns.c          |  1 +
 src/lua/lua_dns_resolver.c |  1 +
 src/lua/lua_map.c          |  1 +
 src/lua/lua_task.c         |  8 +++++---
 src/lua/lua_tcp.c          |  1 +
 src/lua/lua_worker.c       |  1 +
 src/plugins/dkim_check.c   |  1 +
 10 files changed, 65 insertions(+), 15 deletions(-)

diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c
index 785042b8e..354a932f9 100644
--- a/src/lua/lua_common.c
+++ b/src/lua/lua_common.c
@@ -1238,7 +1238,9 @@ rspamd_lua_add_preload (lua_State *L, const gchar *name, lua_CFunction func)
 
 gboolean
 rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
-		GError **err, const gchar *extraction_pattern, ...)
+								  GError **err,
+								  enum rspamd_lua_parse_arguments_flags how,
+								  const gchar *extraction_pattern, ...)
 {
 	const gchar *p, *key = NULL, *end, *cls;
 	va_list ap;
@@ -1314,7 +1316,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap, const gchar **)) = NULL;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, const gchar **)) = NULL;
+					}
 				}
 				else {
 					g_set_error (err,
@@ -1341,7 +1346,9 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap,  gint64 *)) = 0;
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, gint64 *)) = 0;
+					}
 				}
 				else {
 					g_set_error (err,
@@ -1372,7 +1379,11 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap,  gint *)) = -1;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, gint *)) = -1;
+					}
+
 					if (is_table) {
 						lua_pop (L, 1);
 					}
@@ -1404,7 +1415,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap,  gboolean *)) = 0;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, gboolean *)) = 0;
+					}
 				}
 				else {
 					g_set_error (err,
@@ -1432,7 +1446,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap,  gdouble *)) = 0;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, gdouble *)) = 0;
+					}
 				}
 				else {
 					g_set_error (err,
@@ -1460,7 +1477,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap,  gdouble *)) = NAN;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, gdouble *)) = NAN;
+					}
 				}
 				else {
 					g_set_error (err,
@@ -1491,8 +1511,11 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap, const char **)) = NULL;
-					*valuelen = 0;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, const char **)) = NULL;
+						*valuelen = 0;
+					}
 				}
 				else {
 					g_set_error (err,
@@ -1520,7 +1543,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 				}
 				else {
 					failed = TRUE;
-					*(va_arg (ap, ucl_object_t **)) = NULL;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, ucl_object_t **)) = NULL;
+					}
 				}
 
 				if (is_table) {
@@ -1530,7 +1556,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
 			case 'U':
 				if (t == LUA_TNIL || t == LUA_TNONE) {
 					failed = TRUE;
-					*(va_arg (ap, void **)) = NULL;
+
+					if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+						*(va_arg (ap, void **)) = NULL;
+					}
 				}
 				else if (t != LUA_TUSERDATA) {
 					g_set_error (err,
diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index 32b17a2fc..93bb5a28e 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -321,6 +321,10 @@ struct rspamd_async_session* lua_check_session (lua_State * L, gint pos);
 struct ev_loop* lua_check_ev_base (lua_State * L, gint pos);
 struct rspamd_dns_resolver * lua_check_dns_resolver (lua_State * L, gint pos);
 
+enum rspamd_lua_parse_arguments_flags {
+	RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT = 0,
+	RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING,
+};
 /**
  * Extract an arguments from lua table according to format string. Supported arguments are:
  * [*]key=S|I|N|B|V|U{a-z};[key=...]
@@ -337,11 +341,14 @@ struct rspamd_dns_resolver * lua_check_dns_resolver (lua_State * L, gint pos);
  * @param L lua state
  * @param pos at which pos start extraction
  * @param err error pointer
+ * @param how extraction type
  * @param extraction_pattern static pattern
  * @return TRUE if a table has been parsed
  */
 gboolean rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
-		GError **err, const gchar *extraction_pattern, ...);
+										   GError **err,
+										   enum rspamd_lua_parse_arguments_flags how,
+										   const gchar *extraction_pattern, ...);
 
 
 gint rspamd_lua_traceback (lua_State *L);
diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index c171c483a..18baf8551 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -1892,6 +1892,7 @@ lua_config_register_symbol (lua_State * L)
 
 	if (cfg) {
 		if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+				RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 				"name=S;weight=N;callback=F;flags=S;type=S;priority=I;parent=D;"
 				"score=D;description=S;group=S;one_shot=B;nshots=I;"
 				"allowed_ids=S;forbidden_ids=S",
@@ -2227,6 +2228,7 @@ lua_config_set_metric_symbol (lua_State * L)
 
 		if (lua_type (L, 2) == LUA_TTABLE) {
 			if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+					RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 					"*name=S;score=N;description=S;"
 					"group=S;one_shot=B;one_param=B;priority=N;flags=S;"
 					"nshots=I",
@@ -2376,6 +2378,7 @@ lua_config_set_metric_action (lua_State * L)
 
 		if (lua_type (L, 2) == LUA_TTABLE) {
 			if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+					RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 					"*action=S;score=N;"
 					"priority=N",
 					&name, &threshold,
@@ -2881,6 +2884,7 @@ lua_config_register_regexp (lua_State *L)
 	 */
 	if (cfg != NULL) {
 		if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+				RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 				"*re=U{regexp};*type=S;header=S;pcre_only=B",
 				&re, &type_str, &header_str, &pcre_only)) {
 			msg_err_config ("cannot get parameters list: %e", err);
@@ -2947,6 +2951,7 @@ lua_config_replace_regexp (lua_State *L)
 
 	if (cfg != NULL) {
 		if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+				RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 				"*old_re=U{regexp};*new_re=U{regexp}",
 				&old_re, &new_re)) {
 			msg_err_config ("cannot get parameters list: %e", err);
@@ -3686,6 +3691,7 @@ lua_config_add_doc (lua_State *L)
 	if (cfg && option && doc_string) {
 		if (lua_type (L, 5) == LUA_TTABLE) {
 			if (!rspamd_lua_parse_table_arguments (L, 5, &err,
+					RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 					"type=S;default=S;required=B",
 					&type_str, &default_value, &required)) {
 				msg_err_config ("cannot get parameters list: %e", err);
diff --git a/src/lua/lua_dns.c b/src/lua/lua_dns.c
index 033b07fb4..0fdbe3f70 100644
--- a/src/lua/lua_dns.c
+++ b/src/lua/lua_dns.c
@@ -51,6 +51,7 @@ lua_dns_request (lua_State *L)
 
 	/* Check arguments */
 	if (!rspamd_lua_parse_table_arguments (L, 1, &err,
+			RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 			"*name=S;task=U{task};*type=S;forced=B;session=U{session};config=U{config}",
 			&to_resolve,
 			&task,
diff --git a/src/lua/lua_dns_resolver.c b/src/lua/lua_dns_resolver.c
index 382e9e985..a4e3b4b03 100644
--- a/src/lua/lua_dns_resolver.c
+++ b/src/lua/lua_dns_resolver.c
@@ -360,6 +360,7 @@ lua_dns_resolver_resolve_common (lua_State *L,
 
 	/* Check arguments */
 	if (!rspamd_lua_parse_table_arguments (L, first, &err,
+			RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 			"session=U{session};mempool=U{mempool};*name=S;*callback=F;"
 			"option=S;task=U{task};forced=B",
 			&session, &pool, &to_resolve, &cbref, &user_str, &task, &forced)) {
diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c
index 3ba7d0ed1..9c90cdf55 100644
--- a/src/lua/lua_map.c
+++ b/src/lua/lua_map.c
@@ -493,6 +493,7 @@ lua_config_add_map (lua_State *L)
 
 	if (cfg) {
 		if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+				RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 				"*url=O;description=S;callback=F;type=S",
 				&map_obj, &description, &cbidx, &type)) {
 			ret = luaL_error (L, "invalid table arguments: %s", err->message);
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 0ffe4b8c5..f9033eef8 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -5011,6 +5011,7 @@ lua_task_store_in_file (lua_State *L)
 	if (task) {
 		if (lua_istable (L, 2)) {
 			if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+					RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 					"filename=S;tmpmask=S;mode=I;force_new=B;keep=B",
 					&fname, &tmpmask, &mode, &force_new, &keep)) {
 				msg_err_task ("cannot get parameters list: %e", err);
@@ -5112,9 +5113,10 @@ lua_task_process_regexp (lua_State *L)
 	 */
 	if (task != NULL) {
 		if (!rspamd_lua_parse_table_arguments (L, 2, &err,
-					"*re=U{regexp};*type=S;header=V;strong=B",
-					&re, &type_str, &header_len, &header_str,
-					&strong)) {
+				RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
+				"*re=U{regexp};*type=S;header=V;strong=B",
+				&re, &type_str, &header_len, &header_str,
+				&strong)) {
 			msg_err_task ("cannot get parameters list: %e", err);
 
 			if (err) {
diff --git a/src/lua/lua_tcp.c b/src/lua/lua_tcp.c
index e2f55e78b..371e72d5c 100644
--- a/src/lua/lua_tcp.c
+++ b/src/lua/lua_tcp.c
@@ -1797,6 +1797,7 @@ lua_tcp_connect_sync (lua_State *L)
 	struct ev_loop *ev_base = NULL;
 
 	int arguments_validated = rspamd_lua_parse_table_arguments (L, 1, &err,
+			RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 			"task=U{task};session=U{session};resolver=U{resolver};ev_base=U{ev_base};"
 			"*host=S;*port=I;timeout=D;config=U{config}",
 			&task, &session, &resolver, &ev_base,
diff --git a/src/lua/lua_worker.c b/src/lua/lua_worker.c
index 73f8baea1..8b69b71ef 100644
--- a/src/lua/lua_worker.c
+++ b/src/lua/lua_worker.c
@@ -546,6 +546,7 @@ lua_worker_spawn_process (lua_State *L)
 	gint func_cbref, cb_cbref;
 
 	if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+			RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 			"func=F;exec=S;stdin=V;*on_complete=F", &func_cbref,
 			&cmdline, &inputlen, &input, &cb_cbref)) {
 		msg_err ("cannot get parameters list: %e", err);
diff --git a/src/plugins/dkim_check.c b/src/plugins/dkim_check.c
index e1edbccd8..7d3475867 100644
--- a/src/plugins/dkim_check.c
+++ b/src/plugins/dkim_check.c
@@ -701,6 +701,7 @@ lua_dkim_sign_handler (lua_State *L)
 	 * - key
 	 */
 	if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+			RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
 			"key=V;rawkey=V;*domain=S;*selector=S;no_cache=B;headers=S;"
 			"sign_type=S;arc_idx=I;arc_cv=S;expire=I;pubkey=S;"
 			"strict_pubkey_check=B",


More information about the Commits mailing list