On 12/23/2016 04:29 PM, John Fawcett wrote:
> On 12/23/2016 03:56 PM, G. Schlisio wrote:
>>> It was worth checking the obvious to exclude it.
>>>
>>> I suspect that one of the system libraries used by the .forward
>>> mechanism has been impacted by your upgrade.
>>>
>>> If you don't need to use .forward files you might try setting
>>>
>>> forward_path =
>>>
>>> in main.cf and restart postfix. If that solves it,  then there is
>>> something wrong outside postfix.
>>>
>>> John
>> YAY, that fixed it. sendmail -bv reports delivery to dovecot.
>>
>> what was the exact error then and how can i avoid this in the future?
>> just point me to the topics to read, so i dont eat more of your time
>> helping other people with mailing problems or preparing christmas or
>> whatever. your fast and precise help is very much appreciated!
>>
>> best regards
>> georg
> I'm glad it worked. It's a workaround rather than a solution. For people
> that need .forward files, it won't work at all.
>
> There is a priority that local follows, you can read it here:
>
> http://www.postfix.org/postconf.5.html#mailbox_transport_maps
>
> My guess was that there was a lookup failure happening in the .forward
> routines so you never got to the mailbox_transport_maps. By setting
> forward_path to empty then you are skipping the .forward routines
> altogether.
>
> The real problem is happening in the glibc routine getpwnam_r
>
> http://man7.org/linux/man-pages/man3/getpwnam_r.3.html
>
> For users not found in the passwd file postfix expects that this
> function should return 0, but it is returning an error code. I think the
> confusion arises because the original POSIX specification did not
> specifically define all the return values that could be acceptable for
> not found. It would be interesting to see if something in your upgrade
> has changed the way this function is working.
>
> John
>
Georg

Replying to my own post: on re-reading the specification, it looks clear

"On success, *getpwnam_r*() and *getpwuid_r*() return zero, and set
/*result/ to /pwd/. If no matching password record was found, these
functions return 0 and store NULL in /*result/. In case of error, an
error number is returned, and NULL is stored in /*result/. "

So it's the various implementations that may be deviating from this:

"Experiments on various UNIX-like systems show that lots of different
values occur in this situation: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK,
EPERM and probably others."

In the case reported it is returning EINVAL (invalid argument). What
version of glibc are you using?

John

Reply via email to