Am 29.09.2014 um 06:31 schrieb Jason Ekstrand <ja...@jlekstrand.net>:

> 
> On Sep 28, 2014 11:49 AM, "Karsten Otto" <karsten.o...@posteo.de> wrote:
> >
> > From: Philip Withnall <phi...@tecnocode.co.uk>
> >
> > This happens if the socket has been gracefully closed.
> >
> > [KAO: It prevents a potential infinite loop when using a different
> > event handling mechanism than epoll, if said mechanism cannot
> > distinguish EOF from regular read (e.g. select).]
> > ---
> >  src/wayland-server.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/src/wayland-server.c b/src/wayland-server.c
> > index 674aeca..85741cb 100644
> > --- a/src/wayland-server.c
> > +++ b/src/wayland-server.c
> > @@ -260,7 +260,7 @@ wl_client_connection_data(int fd, uint32_t mask, void 
> > *data)
> >         len = 0;
> >         if (mask & WL_EVENT_READABLE) {
> >                 len = wl_connection_read(connection);
> > -               if (len < 0 && errno != EAGAIN) {
> > +               if (len == 0 || (len < 0 && errno != EAGAIN)) {
> >                         wl_client_destroy(client);
> >                         return 1;
> 
> It seems to me as if we should push this up the pipe to wl_connection_read so 
> we fix it server-side too.
> 
What do you mean? Calling wl_client_destroy within wl_client_read? Or making 
sure the connection is properly disposed of in both client and server code?

Regarding the first, you would have to pass the wl_client reference to the read 
function, which would mix API layers unnecessarily. wl_client_read is basically 
just a convenient wrapper around recvmsg, so it should expose the same result 
semantics of >0 (OK), == 0 (EOF), and <0 (error), as it already does. It is up 
to the caller to handle the cases, if only to provide different log messages 
for error and EOF.

Regarding the second, wl_connection_read is part of the wayland 
private/internal API, and only used in two places: wayland-client.c, which 
already handles EOF in an appropriate manner, and wayland-server.c, where the 
proposed patch handles the missing case as well. If anybody else needs to use 
wl_connection_read within the wayland libraries in the future, they are 
hopefully aware of the recv result semantics. If necessary, maybe add some 
documentation to wayland-private.h. 

> >                 }
> > --
> > 1.9.1
> >
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to