aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-07-09 09:57:09 +0300
committerSergey Poznyakoff <gray@gnu.org>2020-07-09 09:57:09 +0300
commitd4c5c2c98e8b5f90a4d3f61fc618e9001685aa38 (patch)
tree3fc78bd67711496aad7d00c859c9a7130de446de /src
parentc0165798d33e476ea8d8dc7f854b0b5edbe7278b (diff)
downloadmailfromd-d4c5c2c98e8b5f90a4d3f61fc618e9001685aa38.tar.gz
mailfromd-d4c5c2c98e8b5f90a4d3f61fc618e9001685aa38.tar.bz2
Fix DKIM record parsing to comply to RFC 6376
* src/dkim.c (dkim_signature_parse,dnsrec_parse): Allow for FWS as per RFC 6376, section 3.2
Diffstat (limited to 'src')
-rw-r--r--src/dkim.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/dkim.c b/src/dkim.c
index 18ad159b..8bf7c906 100644
--- a/src/dkim.c
+++ b/src/dkim.c
@@ -582,7 +582,15 @@ dkim_signature_parse(char *str, struct dkim_signature *ret_sig)
int i;
int rc = 0;
struct dkim_signature sig;
-
+
+ /*
+ * tag-list = tag-spec *( ";" tag-spec ) [ ";" ]
+ * tag-spec = [FWS] tag-name [FWS] "=" [FWS] tag-value [FWS]
+ *
+ * The mu_wordsplit call splits the value on ';' and removes
+ * whitespace at both sides of each token. Internal FWS (around
+ * the equals sign) is removed later.
+ */
ws.ws_delim = ";";
rc = mu_wordsplit(str,
&ws,
@@ -605,6 +613,10 @@ dkim_signature_parse(char *str, struct dkim_signature *ret_sig)
goto end;
}
*p++ = 0;
+ /* Remove internal FWS */
+ mu_rtrim_class(k, MU_CTYPE_BLANK);
+ mu_ltrim_class(p, MU_CTYPE_BLANK);
+ /* Handle known tags */
if (strcmp(k, "a") == 0) {
sig.a = (char*) mu_strdup(p);
} else if (strcmp(k, "b") == 0) {
@@ -1253,7 +1265,9 @@ dnsrec_parse(char *rec, mu_assoc_t *pa)
break;
}
*p++ = 0;
-
+ mu_rtrim_class(ws.ws_wordv[i], MU_CTYPE_BLANK);
+ mu_ltrim_class(p, MU_CTYPE_BLANK);
+
rc = mu_assoc_install_ref(a, ws.ws_wordv[i], &slot);
if (rc == ENOMEM)
mu_alloc_die ();

Return to:

Send suggestions and report system problems to the System administrator.