commit - 1256d7a0bbd5e02619cabac764a79970fb9857d3
commit + 7a470599389f8d5f02cf133dfc80645e8dc44e0e
blob - a80fe73155a15ab043e1a707f959f87e196668da
blob + c655cc4e4bb605f09ee68cf2aae27c8c0359340e
--- ltok.c
+++ ltok.c
const char *
osmtpd_ltok_skip_ar_pvalue(const char *ptr, int optional)
{
- const char *start = ptr, *tmp;
+ const char *start = ptr, *value, *addr, *local;
+ ptr = osmtpd_ltok_skip_cfws(start, 1);
+
+ value = osmtpd_ltok_skip_value(ptr, 1);
+ addr = osmtpd_ltok_skip_addr_spec(ptr, 1);
+ local = osmtpd_ltok_skip_local_part(ptr, 1);
+
+ if (value > ptr)
+ ptr = value;
+
+ if (addr > ptr)
+ ptr = addr;
+
+ if (local > ptr)
+ ptr = local;
+
+ if (ptr == NULL)
+ return optional ? start : NULL;
+
+ return ptr;
+}
+
+const char *
+osmtpd_ltok_skip_ar_propspec(const char *ptr, int optional)
+{
+ const char *start = ptr;
+
+ if (strncmp(ptr, "smtp", sizeof("smtp") - 1) == 0)
+ ptr += sizeof("smtp") - 1;
+ else if (strncmp(ptr, "header", sizeof("header") - 1) == 0)
+ ptr += sizeof("header") - 1;
+ else if (strncmp(ptr, "body", sizeof("body") - 1) == 0)
+ ptr += sizeof("body") - 1;
+ else if (strncmp(ptr, "policy", sizeof("policy") - 1) == 0)
+ ptr += sizeof("policy") - 1;
+ else
+ return optional ? start : NULL;
+
ptr = osmtpd_ltok_skip_cfws(ptr, 1);
- if ((tmp = osmtpd_ltok_skip_value(ptr, 0)) != NULL)
- return tmp;
- ptr = osmtpd_ltok_skip_local_part(ptr, 1);
- if (ptr[0] == '@')
- ptr++;
- if ((ptr = osmtpd_ltok_skip_domain(ptr, 0)) == NULL)
+
+ if (*ptr != '.')
return optional ? start : NULL;
+ ptr++;
+
+ ptr = osmtpd_ltok_skip_cfws(ptr, 1);
+
+ if ((ptr = osmtpd_ltok_skip_keyword(ptr, 0)) == NULL)
+ return optional ? start : NULL;
+
+ ptr = osmtpd_ltok_skip_cfws(ptr, 1);
+
+ if (*ptr != '=')
+ return optional ? start : NULL;
+ ptr++;
+
+ if ((ptr = osmtpd_ltok_skip_ar_pvalue(ptr, 0)) == NULL)
+ return optional ? start : NULL;
+
return ptr;
}
+
+const char *
+osmtpd_ltok_skip_ar_reasonspec(const char *ptr, int optional)
+{
+ const char *start = ptr;
+
+ if (strncmp(ptr, "reason", sizeof("reason") - 1) != 0)
+ return optional ? start : NULL;
+
+ ptr += sizeof("reason") - 1;
+
+ ptr = osmtpd_ltok_skip_cfws(ptr, 1);
+
+ if (*ptr != '=')
+ return optional ? start : NULL;
+ ptr++;
+
+ ptr = osmtpd_ltok_skip_cfws(ptr, 1);
+
+ if ((ptr = osmtpd_ltok_skip_value(ptr, 0)) == NULL)
+ return optional ? start : NULL;
+
+ return ptr;
+}
blob - cee68002870cea1b7b26b1c6f40800b7b93f04c1
blob + cfc1e74a9bf973c4ca7a00ced5849076188a2453
--- ltok.h
+++ ltok.h
const char *osmtpd_ltok_skip_x_key_t_tag_flag(const char *, int);
/* Authentication-Results */
+const char *osmtpd_ltok_skip_ar_propspec(const char *, int);
+const char *osmtpd_ltok_skip_ar_reasonspec(const char *, int);
const char *osmtpd_ltok_skip_ar_pvalue(const char *, int);
const char *osmtpd_ltok_domain_uncomment(const char *);
blob - e3a91a1a6869645166bae19987943dd890ca3b7b
blob + f7b6f05c44bafff3404895b5aa1ad330886ddcbb
--- main.c
+++ main.c
start = osmtpd_ltok_skip_cfws(checkpoint, 1);
if (*start == '\0')
return;
+ ncheckpoint = start;
scan = start;
arlen = 8;
first = 0;
/* reasonspec */
} else if (strncmp(ncheckpoint, "reason",
sizeof("reason") - 1) == 0) {
- ncheckpoint = osmtpd_ltok_skip_value(
- ncheckpoint + sizeof("reason"), 0);
+ ncheckpoint = osmtpd_ltok_skip_ar_reasonspec(
+ ncheckpoint, 0);
/* propspec */
} else {
- ncheckpoint += sizeof("header.x=") - 1;
- ncheckpoint = osmtpd_ltok_skip_ar_pvalue(
+ ncheckpoint = osmtpd_ltok_skip_ar_propspec(
ncheckpoint, 0);
- if (ncheckpoint[0] == ';')
- ncheckpoint++;
}
+
+ if (ncheckpoint == NULL)
+ osmtpd_errx(1, "Invalid AR line: |%s", scan);
+
+ if (*ncheckpoint == ';')
+ ncheckpoint++;
}
}
osmtpd_filter_dataline(ctx, "%s%s", first ? "" : "\t", start);