[vlc-devel] [PATCH] fix sigpipe crash and recover when bad network

Janboe Ye janboe.ye at outlook.com
Fri Feb 21 08:33:46 CET 2020


>From 16540219ff8416395bd7994a6bb2fa9c5ab9984f Mon Sep 17 00:00:00 2001
From: Janboe Ye <janboe.ye at gmail.com>
Date: Fri, 21 Feb 2020 15:25:22 +0800
Subject: [PATCH] fix sigpipe crash and recover when bad network

dsm will send sigpipe when bad network conditional and crash app.
This will disable sigpipe and recovery after writing failure

Signed-off-by: Janboe Ye <janboe.ye at gmail.com>
---
.../0001-setsockopt-to-disable-sigpipe.patch  | 35 +++++++++++++++++++
contrib/src/libdsm/rules.mak                  |  1 +
modules/stream_filter/prefetch.c              |  6 ++--
3 files changed, 39 insertions(+), 3 deletions(-)
create mode 100644 contrib/src/libdsm/0001-setsockopt-to-disable-sigpipe.patch

diff --git a/contrib/src/libdsm/0001-setsockopt-to-disable-sigpipe.patch b/contrib/src/libdsm/0001-setsockopt-to-disable-sigpipe.patch
new file mode 100644
index 0000000000..107c5f3f64
--- /dev/null
+++ b/contrib/src/libdsm/0001-setsockopt-to-disable-sigpipe.patch
@@ -0,0 +1,35 @@
+From b53b1242323c715cee018ac189b9863eccd95240 Mon Sep 17 00:00:00 2001
+From: Janboe Ye <janboe.ye at gmail.com>
+Date: Fri, 21 Feb 2020 15:14:32 +0800
+Subject: [PATCH] setsockopt to disable sigpipe
+
+this signal will crash app when network goes wrong
+
+Signed-off-by: Janboe Ye <janboe.ye at gmail.com>
+---
+ src/netbios_session.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/src/netbios_session.c b/src/netbios_session.c
+index a77cbc7..7ae4dd0 100644
+--- a/src/netbios_session.c
++++ b/src/netbios_session.c
+@@ -54,8 +54,15 @@
+ 
+ static int open_socket_and_connect(netbios_session *s)
+ {
++    int optval = 0;
+     if ((s->socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+         goto error;
++
++    //Never generate SIGPIPE on broken write
++    optval = 1;
++    if (setsockopt(s->socket, SOL_SOCKET, SO_NOSIGPIPE, (void *)&optval, sizeof(int)))
++        goto error;
++
+     if (connect(s->socket, (struct sockaddr *)&s->remote_addr, sizeof(s->remote_addr)) <0)
+         goto error;
+ 
+-- 
+2.23.0
+
diff --git a/contrib/src/libdsm/rules.mak b/contrib/src/libdsm/rules.mak
index 1ea9b769b5..e7b9181865 100644
--- a/contrib/src/libdsm/rules.mak
+++ b/contrib/src/libdsm/rules.mak
@@ -24,6 +24,7 @@ libdsm: libdsm-$(LIBDSM_VERSION).tar.gz .sum-libdsm
	$(APPLY) $(SRC)/libdsm/fix-pc-generation.patch
	$(APPLY) $(SRC)/libdsm/fix-pipe-compat.patch
	$(APPLY) $(SRC)/libdsm/0001-compat-Don-t-use-_pipe-when-building-for-winstore.patch
+	$(APPLY) $(SRC)/libdsm/0001-setsockopt-to-disable-sigpipe.patch
	$(MOVE)

DEPS_libdsm = libtasn1 iconv
diff --git a/modules/stream_filter/prefetch.c b/modules/stream_filter/prefetch.c
index a31f52c67f..1ae63094ea 100644
--- a/modules/stream_filter/prefetch.c
+++ b/modules/stream_filter/prefetch.c
@@ -238,13 +238,13 @@ static void *Thread(void *data)
            len = sys->buffer_size - offset;

        ssize_t val = ThreadRead(stream, sys->buffer + offset, len);
-        if (val < 0)
-            continue;
-        if (val == 0)
+
+        if (val <= 0)
        {
            assert(len > 0);
            msg_Dbg(stream, "end of stream");
            sys->eof = true;
+            val = 0;
        }

        assert((size_t)val <= len);
-- 
2.23.0




More information about the vlc-devel mailing list