Re: [PATCH BlueZ] io_send: Write to pipes with the MSG_NOSIGNAL flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



this is the error message: io_send: Socket operation on non-socket
On Fri, Nov 16, 2018 at 11:36 PM Gal Ben Haim <gbenhaim@xxxxxxxxxx> wrote:
>
> I did this change but it doesn't seem to write as expected, what do you think?
>
> On Fri, Nov 16, 2018 at 10:56 PM Gal Ben-Haim <gbenhaim@xxxxxxxxxx> wrote:
> >
> > bluetoothd receives a SIGPIPE and terminates if writing to a pipe that
> > was acquired by AcquireNotify and there are no readers. it can be
> > reproduced by terminating the reader process without closing the reader
> > end of the pipe.
> >
> > Requesting not to send SIGPIPE will cause the write operation to return an
> > error which will be logged as "io_send: Broken pipe".
> > ---
> >  src/shared/io-ell.c      | 14 ++++++++++++--
> >  src/shared/io-glib.c     | 15 +++++++++++++--
> >  src/shared/io-mainloop.c | 14 ++++++++++++--
> >  src/shared/io.h          |  2 +-
> >  4 files changed, 38 insertions(+), 7 deletions(-)
> >
> > diff --git a/src/shared/io-ell.c b/src/shared/io-ell.c
> > index 6748982c7..2bd166966 100644
> > --- a/src/shared/io-ell.c
> > +++ b/src/shared/io-ell.c
> > @@ -117,7 +117,7 @@ bool io_set_disconnect_handler(struct io *io, io_callback_func_t callback,
> >                                                         user_data, destroy);
> >  }
> >
> > -ssize_t io_send(struct io *io, const struct iovec *iov, int iovcnt)
> > +ssize_t io_send(struct io *io, struct iovec *iov, int iovcnt)
> >  {
> >         ssize_t ret;
> >         int fd;
> > @@ -129,8 +129,18 @@ ssize_t io_send(struct io *io, const struct iovec *iov, int iovcnt)
> >         if (fd < 0)
> >                 return -ENOTCONN;
> >
> > +       const struct msghdr msg = {
> > +                .msg_name = NULL,
> > +                .msg_namelen = 0,
> > +                .msg_iov = iov,
> > +                .msg_iovlen = iovcnt,
> > +                .msg_control = NULL,
> > +                .msg_controllen = 0,
> > +                .msg_flags = 0
> > +        };
> > +
> >         do {
> > -               ret = writev(fd, iov, iovcnt);
> > +               ret = sendmsg(fd, &msg, MSG_NOSIGNAL);
> >         } while (ret < 0 && errno == EINTR);
> >
> >         if (ret < 0)
> > diff --git a/src/shared/io-glib.c b/src/shared/io-glib.c
> > index d62de4e10..7e4c9961b 100644
> > --- a/src/shared/io-glib.c
> > +++ b/src/shared/io-glib.c
> > @@ -26,6 +26,7 @@
> >  #endif
> >
> >  #include <errno.h>
> > +#include <sys/socket.h>
> >
> >  #include <glib.h>
> >
> > @@ -263,7 +264,7 @@ bool io_set_disconnect_handler(struct io *io, io_callback_func_t callback,
> >         return io_set_handler(io, G_IO_HUP, callback, user_data, destroy);
> >  }
> >
> > -ssize_t io_send(struct io *io, const struct iovec *iov, int iovcnt)
> > +ssize_t io_send(struct io *io, struct iovec *iov, int iovcnt)
> >  {
> >         int fd;
> >         ssize_t ret;
> > @@ -273,8 +274,18 @@ ssize_t io_send(struct io *io, const struct iovec *iov, int iovcnt)
> >
> >         fd = io_get_fd(io);
> >
> > +       const struct msghdr msg = {
> > +                .msg_name = NULL,
> > +                .msg_namelen = 0,
> > +                .msg_iov = iov,
> > +                .msg_iovlen = iovcnt,
> > +                .msg_control = NULL,
> > +                .msg_controllen = 0,
> > +                .msg_flags = 0
> > +        };
> > +
> >         do {
> > -               ret = writev(fd, iov, iovcnt);
> > +               ret = sendmsg(fd, &msg, MSG_NOSIGNAL);
> >         } while (ret < 0 && errno == EINTR);
> >
> >         if (ret < 0)
> > diff --git a/src/shared/io-mainloop.c b/src/shared/io-mainloop.c
> > index 2306c3479..4b6cc14c7 100644
> > --- a/src/shared/io-mainloop.c
> > +++ b/src/shared/io-mainloop.c
> > @@ -298,15 +298,25 @@ bool io_set_disconnect_handler(struct io *io, io_callback_func_t callback,
> >         return true;
> >  }
> >
> > -ssize_t io_send(struct io *io, const struct iovec *iov, int iovcnt)
> > +ssize_t io_send(struct io *io, struct iovec *iov, int iovcnt)
> >  {
> >         ssize_t ret;
> >
> >         if (!io || io->fd < 0)
> >                 return -ENOTCONN;
> >
> > +       const struct msghdr msg = {
> > +               .msg_name = NULL,
> > +               .msg_namelen = 0,
> > +               .msg_iov = iov,
> > +               .msg_iovlen = iovcnt,
> > +               .msg_control = NULL,
> > +               .msg_controllen = 0,
> > +               .msg_flags = 0
> > +       };
> > +
> >         do {
> > -               ret = writev(io->fd, iov, iovcnt);
> > +               ret = sendmsg(io->fd, &msg, MSG_NOSIGNAL);
> >         } while (ret < 0 && errno == EINTR);
> >
> >         if (ret < 0)
> > diff --git a/src/shared/io.h b/src/shared/io.h
> > index 8bc1111d0..522ec26ff 100644
> > --- a/src/shared/io.h
> > +++ b/src/shared/io.h
> > @@ -34,7 +34,7 @@ void io_destroy(struct io *io);
> >  int io_get_fd(struct io *io);
> >  bool io_set_close_on_destroy(struct io *io, bool do_close);
> >
> > -ssize_t io_send(struct io *io, const struct iovec *iov, int iovcnt);
> > +ssize_t io_send(struct io *io, struct iovec *iov, int iovcnt);
> >  bool io_shutdown(struct io *io);
> >
> >  typedef bool (*io_callback_func_t)(struct io *io, void *user_data);
> > --
> > 2.19.1
> >



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux