Fixed. Thanks!
-- Noel Jones
On 4/7/2012 6:05 PM, Wietse Venema wrote:
> Wietse Venema:
>> Noel Jones:
>>> Trying out the new \c feature of smtpd_reject_footer and getting
>>> unexpected behavior. While everything looks normal in the logs, the
>>> sending client gets a timeout/lost connection.
>>>
>>> Oh, found a workaround. Add \n at the end of smtpd_reject_footer.
>>
>> When I tested this I needed no "extra" \n in the reply footer.
>>
>> All the initial \c does is to prevent *prepending* \r\n before the
>> footer text; this is obvious from the code.
>>
>> The \c has no effect on appending the final \r\n. That decision is
>> made independently, also obvious from the code.
>
> All that is correct, but there was one more interaction between \c
> and existing code, that wasn't accounted for.
>
> Namely, don't replace the last "<reply-code> <space>" in the original
> reply by "<reply-code> <hyphen>", when the reply footer starts with
> \c and contains no \n.
>
> Wietse
>
> *** /var/tmp/postfix-2.10-20120404/src/global/smtp_reply_footer.c Fri Mar
> 30 20:09:02 2012
> --- src/global/smtp_reply_footer.c Sat Apr 7 18:56:10 2012
> ***************
> *** 97,102 ****
> --- 97,103 ----
> char *end;
> ssize_t dsn_len;
> int crlf_at_end = 0;
> + int last_reply_patch_offs = -1;
>
> /*
> * Sanity check.
> ***************
> *** 115,120 ****
> --- 116,122 ----
> || (cp[3] != ' ' && cp[3] != '-'))
> return (-1);
> cp[3] = '-';
> + last_reply_patch_offs = cp + 3 - STR(buffer);
> if ((next = strstr(cp, "\r\n")) == 0) {
> next = end;
> break;
> ***************
> *** 159,164 ****
> --- 161,167 ----
> vstring_strncat(buffer, STR(buffer) + start + 4, (int) dsn_len);
> vstring_strcat(buffer, " ");
> }
> + last_reply_patch_offs = -1;
> }
> /* Append one line of footer text. */
> mac_expand(buffer, cp, MAC_EXP_FLAG_APPEND, filter, lookup, context);
> ***************
> *** 168,173 ****
> --- 171,178 ----
> } else
> break;
> }
> + if (last_reply_patch_offs > 0)
> + STR(buffer)[last_reply_patch_offs] = ' ';
> if (crlf_at_end)
> vstring_strcat(buffer, "\r\n");
> return (0);