commit 3082f0981a058b17619c641fe213801660fe5039 from: Martijn van Duren date: Tue Apr 19 14:53:19 2022 UTC Handle spaces in key-p-tag correctly. Reported by Mischa Peters. commit - b8958f33de58347189a0672e057e56638e8df03c commit + 3082f0981a058b17619c641fe213801660fe5039 blob - 92593c4e4a5b7bd42f1f39ce64d39b327dc6b2fe blob + 8f324e536ea02ba338e434de491b4f778535a399 --- main.c +++ main.c @@ -1207,7 +1207,7 @@ int dkim_key_text_parse(struct signature *sig, const char *key) { char tagname, *hashname; - const char *end, *tagvend, *b64; + const char *end, *tagvend; char pkraw[UINT16_MAX] = "", pkimp[UINT16_MAX]; size_t pkrawlen = 0, pkoff, linelen; int h = 0, k = 0, n = 0, p = 0, s = 0, t = 0, first = 1; @@ -1309,32 +1309,30 @@ dkim_key_text_parse(struct signature *sig, const char if (p != 0) /* Duplicate tag */ return 0; p = 1; - tagvend = key; while (1) { - b64 = osmtpd_ltok_skip_fws(tagvend, 1); + key = osmtpd_ltok_skip_fws(key, 1); if (osmtpd_ltok_skip_alphadigitps( - tagvend, 0) == NULL) + key, 0) == NULL) break; - pkraw[pkrawlen++] = tagvend++[0]; + pkraw[pkrawlen++] = key++[0]; if (pkrawlen >= sizeof(pkraw)) return 0; } - if (tagvend[0] == '=') { + if (key[0] == '=') { pkraw[pkrawlen++] = '='; - tagvend = osmtpd_ltok_skip_fws(b64 + 1, 1); + key = osmtpd_ltok_skip_fws(key + 1, 1); if (pkrawlen >= sizeof(pkraw)) return 0; - if (tagvend[0] == '=') { + if (key[0] == '=') { pkraw[pkrawlen++] = '='; - tagvend++; + key++; if (pkrawlen >= sizeof(pkraw)) return 0; } } /* Invalid tag value */ - if (pkrawlen % 4 != 0 || tagvend != end) + if (pkrawlen % 4 != 0 || key != end) return 0; - key = end; break; case 's': if (s != 0) /* Duplicate tag */