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. Ignoring the SIGPIPE will cause the write operation to return a "io_send: Broken pipe" error which will be logged. --- src/gatt-client.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gatt-client.c b/src/gatt-client.c index 234f46ed7..236f38ad5 100644 --- a/src/gatt-client.c +++ b/src/gatt-client.c @@ -1137,6 +1137,9 @@ static DBusMessage *characteristic_create_pipe(struct characteristic *chrc, if (pipe2(pipefd, O_DIRECT | O_NONBLOCK | O_CLOEXEC) < 0) return btd_error_failed(msg, strerror(errno)); + /* Ignore SIGPIPE, a broken pipe error will be returned if the pipe has no readers */ + signal(SIGPIPE, SIG_IGN); + dir = dbus_message_has_member(msg, "AcquireWrite"); io = io_new(pipefd[!dir]); -- 2.19.1