[vlc-devel] 答复: 答复: [PATCH] core: network: recover from reading on invalid sockets

Steve Lhomme robux4 at ycbcr.xyz
Wed Jan 16 11:51:44 CET 2019



On 16/01/2019 11:42, Xie Zhigang wrote:
> Yes, these patches are working on my case.
> The essential idea in these patches is to keep the opened events,
> but the fix is not elegant enough for the static array and the 4095 limit.
> Is there a way to rewrite the struct of pollfd including a member
> and keeping the opened events in it only on Windows?

For my mingw64 builds HAVE_STRUCT_POLLFD is defined, so we use the one 
from the toolchain and not the one in vlc_fixups.h so, no.

>
> Regards,
> Zhigang.
> ------------------------------------------------------------------------
> *发件人:* vlc-devel <vlc-devel-bounces at videolan.org> 代表 Steve Lhomme 
> <robux4 at ycbcr.xyz>
> *发送时间:* 2019年1月16日 16:13
> *收件人:* vlc-devel at videolan.org
> *主题:* Re: [vlc-devel] 答复: [PATCH] core: network: recover from reading 
> on invalid sockets
> Do these patches fix your issue ?
>
> https://patches.videolan.org/patch/13959/
> https://patches.videolan.org/patch/13960/
> https://patches.videolan.org/patch/13961/
>
> On 16/01/2019 07:19, Xie Zhigang wrote:
> > Hi,
> >
> > Exactly YES, it is related to 
> https://trac.videolan.org/vlc/ticket/21153 
> <https://trac.videolan.org/vlc/ticket/21153> .
> >
> > WSAEventSelect() does not get the FD_CLOSE event, and the poll() is 
> in dysfunctional state
> > if remote server TCP RST the connection. I have dumped the traffic 
> data as resuming the play:
> >
> > #28362  30.011007   TCP 68  38912 → 80 [ACK] Seq=350 Ack=21995213 
> Win=768 Len=0 TSval=4568331 TSecr=555407
> > #28392  30.236684   TCP 836 [TCP Window Full] 80 → 38912 [PSH, ACK] 
> Seq=21995213 Ack=350 Win=30080 Len=768 TSval=555474 TSecr=4568331 [TCP 
> segment of a reassembled PDU]
> > #28393  30.236717   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4568387 TSecr=555474
> > #28394  30.460288   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=555530 TSecr=4568387
> > #28395  30.460300   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4568443 TSecr=555474
> > #28396  30.908290   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=555642 TSecr=4568443
> > #28397  31.804538   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=555866 TSecr=4568443
> > #28398  31.804564   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4568779 TSecr=555474
> > #28399  33.600277   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=556315 TSecr=4568779
> > #28400  33.600290   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4569228 TSecr=555474
> > #28401  37.188314   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=557212 TSecr=4569228
> > #28402  37.188347   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4570125 TSecr=555474
> > #28435  44.372520   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=559008 TSecr=4570125
> > #28436  44.372531   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4571921 TSecr=555474
> > #28469  58.744435   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=562601 TSecr=4571921
> > #28470  58.744451   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4575514 TSecr=555474
> > #28561  87.508600   TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=569792 TSecr=4575514
> > #28562  87.508611   TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4582705 TSecr=555474
> > #28739  144.980525  TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=584160 TSecr=4582705
> > #28740  144.980549  TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4597073 TSecr=555474
> > #29080  259.797508  TCP 68  [TCP Keep-Alive]  80 → 38912 [ACK] 
> Seq=21995980 Ack=350 Win=30080 Len=0 TSval=612864 TSecr=4597073
> > #29081  259.797533  TCP 68  [TCP ZeroWindow]  38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=0 Len=0 TSval=4625777 TSecr=555474
> > #34207  2022.822738 TCP 68  [TCP Window Update] 38912 → 80 [ACK] 
> Seq=350 Ack=21995981 Win=75136 Len=0 TSval=5066533 TSecr=555474
> > #34208  2022.823030 TCP 62  80 → 38912 [RST] Seq=21995981 Win=0 Len=0
> >
> > As we expect an FD_CLOSE event on the TCP RST traffic, but poll() is 
> in ignorance of it.
> > It is reproducible on Windows. On Linux, the poll() is in another 
> implementation and it is ok.
> >
> > I found another patch to it in poll()'s windows implementation,
> > that is to reset the errno at the beginning of poll() implementation.
> > It seems to enable the capability of WSAEventSelect() for FD_CLOSE,
> > but it is more difficult to be considered as a good fix than my 
> first patch is:
> >
> > ---
> >   compat/poll.c | 2 ++
> >   1 file changed, 2 insertions(+)
> >
> > diff --git a/compat/poll.c b/compat/poll.c
> > index 8020f7d..5ff43ea 100644
> > --- a/compat/poll.c
> > +++ b/compat/poll.c
> > @@ -113,6 +113,8 @@ static int poll_compat(struct pollfd *fds, 
> unsigned nfds, int timeout)
> >   {
> >       DWORD to = (timeout >= 0) ? (DWORD)timeout : INFINITE;
> >
> > +    /* clears the errno to enable WSAEventSelect detecting the 
> FD_CLOSE event. */
> > +    errno = 0;
> >       if (nfds == 0)
> >       {    /* WSAWaitForMultipleEvents() does not allow zero events */
> >           if (SleepEx(to, TRUE))
> > --
> > 2.7.4
> >
> >
> > 发件人: vlc-devel <vlc-devel-bounces at videolan.org> 代表 
> jeremy.vignelles at dev3i.fr <jeremy.vignelles at dev3i.fr>
> > 发送时间: 2019年1月15日 23:37
> > 收件人: 'Mailing list for VLC media player developers'
> > 主题: Re: [vlc-devel] [PATCH] core: network: recover from reading on 
> invalid sockets
> >
> > Hi,
> > Is this patch related to https://trac.videolan.org/vlc/ticket/21153 ?
> >
> > This does not look like a proper fix for me either.
> >
> > Regards,
> > Jérémy VIGNELLES
> >
> > De : vlc-devel <vlc-devel-bounces at videolan.org> De la part de Rémi 
> Denis-Courmont
> > Envoyé : mardi 15 janvier 2019 15:39
> > À : Mailing list for VLC media player developers 
> <vlc-devel at videolan.org>
> > Objet : Re: [vlc-devel] [PATCH] core: network: recover from reading 
> on invalid sockets
> >
> > Hi,
> >
> > This statistical approach oooks like it can lead to spurious 
> failures, on all platforms. No way.
> >
> > The bug must be somewhere else.
> > Le 15 janvier 2019 13:52:12 GMT+02:00, Xie Zhigang 
> <mailto:zighouse at hotmail.com> a écrit :
> > Fix the bug on Windows: if pausing the on-line VOD playing
> > for a long time (5 minutes or so), and the remote VOD server drops the
> > tcp connection, vlc_tls_Read() will be in an endless loop of retrial
> > with errno as EAGAIN. Use a max retrial count to recover vlc from the
> > endless reading loop.
> > ________________________________________
> >   src/network/stream.c | 7 +++++++
> >   1 file changed, 7 insertions(+)
> >
> > diff --git a/src/network/stream.c b/src/network/stream.c
> > index 6e015d5..7324f78 100644
> > --- a/src/network/stream.c
> > +++ b/src/network/stream.c
> > @@ -55,6 +55,7 @@ ssize_t vlc_tls_Read(vlc_tls_t *session, void 
> *buf, size_t len, bool waitall)
> >   {
> >       struct pollfd ufd;
> >       struct iovec iov;
> > +    int turn = 0;
> >
> >       ufd.events = POLLIN;
> >       ufd.fd = vlc_tls_GetPollFD(session, &ufd.events);
> > @@ -89,6 +90,12 @@ ssize_t vlc_tls_Read(vlc_tls_t *session, void 
> *buf, size_t len, bool waitall)
> >           }
> >
> >           vlc_poll_i11e(&ufd, 1, -1);
> > +        /*
> > +         * Use an arbitrary max retrial count (10) to recover from 
> endless loop
> > +         * on an invalid connection.
> > +         */
> > +        if (++turn > 10)
> > +            return rcvd ? (ssize_t)rcvd : -1;
> >       }
> >   }
> >
> >
> > --
> > Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez 
> excuser ma brièveté.
> >
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel



More information about the vlc-devel mailing list