e07@nikhefh.nikhef.nl (Eric Wassenaar) (05/06/91)
Description: sendmail mangles mailheaders which have brackets embedded in quoted strings or in parenthesized comments such as From: "formerly <user@old>" <user@new> To: user@new (formerly <user@old>) Analysis: The problem is within crackaddr() in headers.c which (too simply-minded) tries to locate an opening bracket with p = index(addr, '<'); if (p != NULL) in the plain address string, disregarding any comments. Suggested fix: Below is an attempt for a routine to do a fancier search. Change the two lines mentioned above into p = find_delim(addr, '<'); if (*p != '\0') Change the entire for-loop to locate the matching bracket to p = find_delim(addr, '>'); /* ** FIND_DELIM - Find the position of a delimiter in an address. ** ** It will search for an unquoted delimiter outside comments. ** Used by crackaddr() to locate brackets in addresses like: ** ** "comment" <address (comment)> ** ** Parameters: ** addr -- the address to be cracked. ** delim -- the desired delimiter. ** ** Returns: ** pointer to delim in addr if found, ** pointer to null byte if not found. */ char * find_delim(addr, delim) char *addr; char delim; { bool backslash = FALSE; bool quoted_string = FALSE; int comment = 0; int bracket = 0; register char *p; /* strategy a la prescan() */ for (p = addr; *p != '\0'; p++) { if (backslash) backslash = FALSE; else if (*p == '\\') backslash = TRUE; else if (quoted_string && *p == '"') quoted_string = FALSE; else if (quoted_string) continue; else if (*p == delim && comment <= 0 && bracket <= 0) break; else if (*p == '(') comment++; else if (*p == ')') comment--; else if (comment > 0) continue; else if (*p == '<') bracket++; else if (*p == '>') bracket--; else if (*p == '"') quoted_string = TRUE; } /* p points to the delimiter, or to a null byte */ return (p); } Eric Wassenaar -- Organization: NIKHEF-H, National Institute for Nuclear and High-Energy Physics Address: Kruislaan 409, P.O. Box 41882, 1009 DB Amsterdam, the Netherlands Phone: +31 20 592 0412, Home: +31 20 6909449, Telefax: +31 20 592 5155 Internet: e07@nikhef.nl