Vladimir Vassiliev: > Hi, > > it's a question more like to developers. > I'm using commercial anti-spam Milter. It adds some headers to message, > particularly, > X-SpamTest-Status and X-SpamTest-Status-Extended. Problem is that only latter > of these two appears > in message. More of it, two copies of these header are added to message. > Problem appears only for this two headers. > Can this be a bug in Postfix (for example, something with substring search)?
This was caused by a length check against the wrong string (the header name that was found, instead of the header name that was wanted). I notice that this application does a lot of ADDHEADER header1 value1 CHGHEADER 1 header1 value1 ADDHEADER header2 value2 CHGHEADER 2 header2 value2 ADDHEADER header3 value3 CHGHEADER 3 header3 value3 And so on, i.e. the application adds a header and replaces it with the same value. I have added this as a test case to the source code so it won't happen again. As a workaround, the application could send just the ADDHEADER requests, without the CHGHEADER requests that replace a header by the same text. Wietse diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in -cr /var/tmp/postfix-2.10-20120130/src/cleanup/cleanup_milter.c ./cleanup_milter.c *** /var/tmp/postfix-2.10-20120130/src/cleanup/cleanup_milter.c Sat Jan 14 20:39:14 2012 --- ./cleanup_milter.c Thu Feb 2 09:35:03 2012 *************** *** 845,852 **** /* Reset the saved PTR record and update last_type. */ ; else if ((header_label == 0 || (strncasecmp(header_label, STR(buf), len) == 0 ! && (IS_SPACE_TAB(STR(buf)[len]) ! || STR(buf)[len] == ':'))) && --index == 0) { /* If we have a saved PTR record, it points to start of header. */ break; --- 845,851 ---- /* Reset the saved PTR record and update last_type. */ ; else if ((header_label == 0 || (strncasecmp(header_label, STR(buf), len) == 0 ! && (strlen(header_label) == len))) && --index == 0) { /* If we have a saved PTR record, it points to start of header. */ break;