[Pymilter] poll() returned exception for socket, abort

Tom Hendrikx tom at whyscream.net
Sun Jan 13 07:23:05 EST 2013


On 13-01-13 13:09, Tom Hendrikx wrote:
> Hi,
> 
> I'm currently adding daemon support to my milter, using a simplified
> version of the routine as documented in PEP3143 and implemented in
> http://pypi.python.org/pypi/python-daemon/
> 
> For some reason, the milter aborts after processing the single
> connection. The first connection is handled properly, and a few seconds
> after the disconnect is completed, syslog reports: "python: MyMilter:
> poll() returned exception for socket, abort", and the milter process is
> gone.
> 
> I narrowed it down to closing all file descriptors. When using this
> piece of code:
> 
>     # Close file descriptors
>     save_fds = [sys.stderr.fileno()]
>     for fd in reversed(range(2048)):
>         if fd not in save_fds:
>             try:
>                 os.close(fd)
>                 print('Closed fd {}'.format(fd))
>             except OSError, err:
>                 if err.errno == errno.EBADF:
>                     # File descriptor was not open
>                     pass
> 
> This works, as long as there is at least one fd listed in save_fds. It
> doesn't matter whether it's stdout, stderr or stdin: anyone will do. As
> soon as I set 'safe_fds = [], and all fds are closed, the above error
> turns up and the milter exits after the first connection.
> 
> Any ideas? I can't even find where this error message is generated...
> 

Err, I left the stderr fd open, and also disabled redirecting sys.stderr
to os.devnull, and now I got a traceback in terminal stating
"milter.error: out of thread resources". That gives room for more
research, so continuing the search...





More information about the Pymilter mailing list