block SIGPIPE before writing to a pipe
PATCH 1/1 block SIGPIPE before writing to a pipe
We have to block SIGPIPE before we're writing to the communication pipe otherwise the daemon will be killed if the listening program terminates prematurely.
Signed-off-by Hannes Reinecke <[email protected]>
--- libmultipath/uxsock.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-)
libmultipath/uxsock.c +20 -3
@@ -14,6 +14,7 @@#include <sys/socket.h> #include <sys/un.h> #include <sys/poll.h> +#include <signal.h> #include <errno.h> #include "memory.h"
@@ -127,9 +128,25 @@ size_t read_all(int fd, void *buf, size_t len)*/ int send_packet (int fd,const char *buf,size_t len) { -if (write_all (fd, &len,sizeof (len)) !=sizeof (len))return -1 ; -if (write_all (fd, buf, len) != len)return -1 ; -return 0 ; +int ret =0 ; +#ifdef DAEMON +sigset_t set, old; + +/* Block SIGPIPE */ +sigemptyset (&set); +sigaddset (&set,SIGPIPE ); +pthread_sigmask (SIG_BLOCK , &set, &old); +#endif +if (write_all (fd, &len,sizeof (len)) !=sizeof (len)) + ret =-1 ; +if (!ret &&write_all (fd, buf, len) != len) + ret =-1 ; + +#ifdef DAEMON +/* And unblock it again */ +pthread_sigmask (SIG_SETMASK , &old,NULL ); +#endif +return ret; }/*
Signature · 1 line
1.5.2.4