commit 60e9f82dc81c599272bc0061157850239f54ae10 from: Martijn van Duren date: Thu Jan 27 22:46:14 2022 UTC Strip CFWS when returning domain names from osmtpd_mheader_from_domain Pointed out by Paul Pace commit - 5fdffb49b9198907d9f91b76cf7128286e175a0a commit + 60e9f82dc81c599272bc0061157850239f54ae10 blob - 27cbf4b7f67fbbc86b56567208bb666bd625c54c blob + 564c6af238a36e473a73f4985b850478a82eeb02 --- mheader.c +++ mheader.c @@ -22,6 +22,7 @@ #include "mheader.h" +#include char * osmtpd_mheader_skip_sp(char *ptr, int optional) { @@ -481,6 +482,7 @@ osmtpd_mheader_skip_domain_literal(char *ptr, int opti } if (ptr[0] != ']') return optional ? start : NULL; + ptr++; return osmtpd_mheader_skip_cfws(ptr, 1); } @@ -625,7 +627,42 @@ osmtpd_mheader_skip_name_addr(char *ptr, int optional) return optional ? start : NULL; return ptr; } + +char * +osmtpd_mheader_domain_uncomment(char *ptr) +{ + char *domain0, *domain, *tmp, *end; + if (osmtpd_mheader_skip_dot_atom(ptr, 0) != NULL) { + ptr = osmtpd_mheader_skip_cfws(ptr, 1); + return strndup(ptr, + osmtpd_mheader_skip_dot_atom_text(ptr, 0) - ptr); + } + if ((tmp = osmtpd_mheader_skip_domain_literal(ptr, 0)) != NULL) { + ptr = osmtpd_mheader_skip_cfws(ptr, 1) + 1; + domain0 = domain = strndup(ptr, (size_t)(tmp - ptr)); + if (domain0 == NULL) + return NULL; + end = domain0 + (tmp - ptr) + 1; + domain++; + while (1) { + tmp = osmtpd_mheader_skip_fws(domain, 1); + if (tmp != domain) { + memmove(domain, tmp, end - tmp); + end -= (tmp - domain); + } + tmp = osmtpd_mheader_skip_dtext(domain, 0); + if (tmp == NULL) + break; + domain = tmp; + } + /* domain[0] == ']' */ + domain[0] = '\0'; + return domain0; + } + return strndup(ptr, osmtpd_mheader_skip_obs_domain(ptr, 1) - ptr); +} + /* Return the domain component of the first mailbox */ char * osmtpd_mheader_from_domain(char *ptr) @@ -669,15 +706,13 @@ osmtpd_mheader_from_domain(char *ptr) ptr = osmtpd_mheader_skip_local_part(ptr, 0); /* @ */ ptr++; - tmp = osmtpd_mheader_skip_domain(ptr, 0); - return strndup(ptr, tmp - ptr); + return osmtpd_mheader_domain_uncomment(ptr); } if (osmtpd_mheader_skip_addr_spec(ptr, 0) != NULL) { ptr = osmtpd_mheader_skip_local_part(ptr, 0); /* @ */ ptr++; - tmp = osmtpd_mheader_skip_domain(ptr, 0); - return strndup(ptr, tmp - ptr); + return osmtpd_mheader_domain_uncomment(ptr); } errno = EINVAL; return NULL; blob - 133d5dd0283a4b3a869c7aee1c189e55a74f343c blob + cb9d13f0089db44805e485e618ff4ad4b686e884 --- mheader.h +++ mheader.h @@ -60,4 +60,5 @@ char *osmtpd_mheader_skip_obs_angle_addr(char *, int); char *osmtpd_mheader_skip_angle_addr(char *, int); char *osmtpd_mheader_skip_name_addr(char *, int); +char *osmtpd_mheader_domain_uncomment(char *); char *osmtpd_mheader_from_domain(char *);