commit 2e48572: [Fix] Dkim: Ignore unknown DKIM kv pairs as stated in RFC

Vsevolod Stakhov vsevolod at rspamd.com
Tue Jun 28 19:21:03 UTC 2022


Author: Vsevolod Stakhov
Date: 2022-06-28 20:20:21 +0100
URL: https://github.com/rspamd/rspamd/commit/2e4857278d8f1bb3b87367ab0ab306044ffe9c55 (HEAD -> master)

[Fix] Dkim: Ignore unknown DKIM kv pairs as stated in RFC

---
 src/libserver/dkim.c | 73 ++++++++++++++++++++++++++++------------------------
 1 file changed, 40 insertions(+), 33 deletions(-)

diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c
index 4d32dd8fd..4a8e13903 100644
--- a/src/libserver/dkim.c
+++ b/src/libserver/dkim.c
@@ -973,12 +973,8 @@ rspamd_create_dkim_context (const gchar *sig,
 					param = DKIM_PARAM_IGNORE;
 					break;
 				default:
-					g_set_error (err,
-						DKIM_ERROR,
-						DKIM_SIGERROR_UNKNOWN,
-						"invalid dkim param: %c",
-						*tag);
-					state = DKIM_STATE_ERROR;
+					param = DKIM_PARAM_UNKNOWN;
+					msg_debug_dkim("unknown DKIM param %c, ignoring it", *tag);
 					break;
 				}
 				break;
@@ -1036,8 +1032,7 @@ rspamd_create_dkim_context (const gchar *sig,
 			break;
 		case DKIM_STATE_VALUE:
 			if (*p == ';') {
-				if (param == DKIM_PARAM_UNKNOWN ||
-					p - c == 0) {
+				if (p - c == 0 || c > p) {
 					state = DKIM_STATE_ERROR;
 				}
 				else {
@@ -1053,10 +1048,20 @@ rspamd_create_dkim_context (const gchar *sig,
 						tmp --;
 					}
 
-					if (!parser_funcs[param](ctx, c, tlen, err)) {
-						state = DKIM_STATE_ERROR;
+					if (param != DKIM_PARAM_UNKNOWN) {
+						if (!parser_funcs[param](ctx, c, tlen, err)) {
+							state = DKIM_STATE_ERROR;
+						}
+						else {
+							state = DKIM_STATE_SKIP_SPACES;
+							next_state = DKIM_STATE_TAG;
+							p++;
+							taglen = 0;
+						}
 					}
 					else {
+						/* Unknown param has been ignored */
+						msg_debug_dkim("ignored unknown parameter value: %*s", tlen, c);
 						state = DKIM_STATE_SKIP_SPACES;
 						next_state = DKIM_STATE_TAG;
 						p++;
@@ -1065,38 +1070,40 @@ rspamd_create_dkim_context (const gchar *sig,
 				}
 			}
 			else if (p == end) {
-				if (param == DKIM_PARAM_UNKNOWN) {
-					state = DKIM_STATE_ERROR;
-				}
-				else {
-					gint tlen = p - c;
-					const gchar *tmp = p - 1;
+				/* Last parameter with no `;` character */
+				gint tlen = p - c;
+				const gchar *tmp = p - 1;
 
-					while (tlen > 0) {
-						if (!g_ascii_isspace (*tmp)) {
-							break;
-						}
-						tlen --;
-						tmp --;
+				while (tlen > 0) {
+					if (!g_ascii_isspace (*tmp)) {
+						break;
 					}
+					tlen --;
+					tmp --;
+				}
 
+				if (param != DKIM_PARAM_UNKNOWN) {
 					if (!parser_funcs[param](ctx, c, tlen, err)) {
 						state = DKIM_STATE_ERROR;
 					}
-					if (state == DKIM_STATE_ERROR) {
-						/*
-						 * We need to return from here as state machine won't
-						 * do any more steps after p == end
-						 */
-						if (err) {
-							msg_info_dkim ("dkim parse failed: %e", *err);
-						}
+				}
+				else {
+					msg_debug_dkim("ignored unknown parameter value: %*s", tlen, c);
+				}
 
-						return NULL;
+				if (state == DKIM_STATE_ERROR) {
+					/*
+					 * We need to return from here as state machine won't
+					 * do any more steps after p == end
+					 */
+					if (err) {
+						msg_info_dkim ("dkim parse failed: %e", *err);
 					}
-					/* Finish processing */
-					p++;
+
+					return NULL;
 				}
+				/* Finish processing */
+				p++;
 			}
 			else {
 				p++;


More information about the Commits mailing list