[PATCH] (partial) tevent_req_poll() loops for ever....
boyang at samba.org
Wed May 13 14:50:25 GMT 2009
Jeremy Allison wrote:
> On Mon, Apr 20, 2009 at 10:04:55AM -0600, Bo Yang wrote:
>> Hi, everyone:
>> Taking cm_connect_lsa() for example. Assuming network connectionis good initially, but when cli_rpc_pipe_open_spnego_ntlmssp() isinvoked, remote end is closed. So, it returnsNT_STATUS_BROKEN_PIPE(mapped from EPIPE). Then we go to schannel oranonymous, which makes no difference. Because the socket is brokennow(but fd is owned by current process, winbindd), the fd(socket) won'tbe writable or readable any more. Then have a look at whattevent_req_poll() does, req is always in progress, tevent_loop_once()--> s3_event_loop_once() ---> add the fd to select's writefds set---> select times out and returns 0. again and again,tevent_req_poll() loops forever........
>> I think we should do a test after each rpc call to see if thestatus is BROKEN PIPE, if it is, we must close the socket and free allpipes. We must close socket first, and set cli->fd to -1. Otherwise,pipe's destructor will try to write to the fd, which causetevent_req_poll() loops forever. My previous patch to test ifcli->fd must be there to make this work, otherwise, winbindd justcrash in FD_SET(-1, &writefds)....
>> I have add test of the status after rpc call in winbindd_cm.c,but that is not complete. We have to add it other places after rpccall, which would be a lot of repeated work.....
>> Pls correct me if I am wrong. Thanks!
> Ok, I've reviewed this carefully (with some test code) and you're
> completely correct.
> We'll have to deal with this, I've talked to Volker and he has
> some ideas on how to deal with this efficiently.
Is there any idea how to fix this efficiently? Or should I try to post
something first to discuss on this?
> Thanks !
Bo Yang, Software Engineer, Suse Labs
Samba Team boyang at samba.org http://www.samba.org/
Suse Linux boyang at suse.de http://www.novell.com/
More information about the samba-technical