commit - 2293aea1252c99834c4117f51b8e4f3f625ab2ca
commit + ce4bcd16696e4b92aba95886327303fa5521d7cd
blob - 16d759acc94b7412e13b496e71fa3e8e82e14a3c
blob + 4d53b010225f67fd26a88c0c6128cbea15c61a3c
--- main.c
+++ main.c
char *b;
size_t bsz;
const char *bheader;
+ size_t bheadersz;
+#define HEADER_B_MAX_LEN 8
+ char bheaderclean[HEADER_B_MAX_LEN + 1];
/* Make sure padding bits for base64 decoding fit */
char bh[EVP_MAX_MD_SIZE + (3 - (EVP_MAX_MD_SIZE % 3))];
size_t bhsz;
dkim_signature_parse_b(struct signature *sig, const char *start, const char *end)
{
int decodesz;
+ size_t i, j;
if (sig->b != NULL) {
dkim_signature_state(sig, DKIM_PERMERROR, "Duplicate b tag");
return;
}
sig->bheader = start;
- if ((sig->b = malloc((((end - start) / 4) + 1) * 3)) == NULL) {
- dkim_err(sig->header->msg, "malloc");
- return;
- }
+ sig->bheadersz = end - start;
+ if ((sig->b = malloc(((sig->bheadersz / 4) + 1) * 3)) == NULL)
+ osmtpd_err(1, "malloc");
/* EVP_DecodeBlock doesn't handle internal whitespace */
EVP_DecodeInit(ectx);
- if (EVP_DecodeUpdate(ectx, sig->b, &decodesz, start,
- (int)(end - start)) == -1) {
+ if (EVP_DecodeUpdate(ectx, sig->b, &decodesz, sig->bheader,
+ (int) sig->bheadersz) == -1) {
dkim_signature_state(sig, DKIM_PERMERROR, "Invalid b tag");
return;
}
return;
}
sig->bsz += decodesz;
+ for (i = 0, j = 0;
+ i < sig->bheadersz && j < HEADER_B_MAX_LEN; i++) {
+ if (isalnum(sig->bheader[i]) || sig->bheader[i] == '/'
+ || sig->bheader[i] == '+' || sig->bheader[i] == '=')
+ sig->bheaderclean[j++] = sig->bheader[i];
+ }
+ sig->bheaderclean[j] = '\0';
}
void
goto fail;
}
}
+ if (sig->bheaderclean[0] != '\0') {
+ if ((aroff = dkim_ar_cat(&line, &linelen, aroff,
+ " header.b=%s", sig->bheaderclean)) == -1) {
+ dkim_err(msg, "malloc");
+ goto fail;
+ }
+ }
}
if (!found) {
aroff = dkim_ar_cat(&line, &linelen, aroff, "; dkim=none");