Commit Diff


commit - 5fdffb49b9198907d9f91b76cf7128286e175a0a
commit + 60e9f82dc81c599272bc0061157850239f54ae10
blob - 27cbf4b7f67fbbc86b56567208bb666bd625c54c
blob + 564c6af238a36e473a73f4985b850478a82eeb02
--- mheader.c
+++ mheader.c
@@ -22,6 +22,7 @@
 
 #include "mheader.h"
 
+#include <stdio.h>
 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 *);