aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYousong Zhou <yszhou4tech@gmail.com>2017-02-13 19:47:28 +0800
committerYousong Zhou <yszhou4tech@gmail.com>2017-02-14 19:36:52 +0800
commit069879fa4d2349a59671c5c50fbcdaf6e6a11dcf (patch)
tree7606d87c5c7b9f7e4c841e5045a3c9564e5e2690
parentf20e7ec2ea0288fd529191039d7160fb9e9a015b (diff)
xl2tpd: backporting fix for race condition causing xl2tpd hang
The patch was taken from https://github.com/xelerance/xl2tpd/pull/125 Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
-rw-r--r--net/xl2tpd/Makefile2
-rw-r--r--net/xl2tpd/patches/200-xl2tpd-control-fix-xl2tpd-hanged-up-in-fopen.patch92
2 files changed, 93 insertions, 1 deletions
diff --git a/net/xl2tpd/Makefile b/net/xl2tpd/Makefile
index ae5a41be0..50be12e87 100644
--- a/net/xl2tpd/Makefile
+++ b/net/xl2tpd/Makefile
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=xl2tpd
PKG_VERSION:=devel-20151125
-PKG_RELEASE:=2
+PKG_RELEASE:=3
PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=LICENSE
diff --git a/net/xl2tpd/patches/200-xl2tpd-control-fix-xl2tpd-hanged-up-in-fopen.patch b/net/xl2tpd/patches/200-xl2tpd-control-fix-xl2tpd-hanged-up-in-fopen.patch
new file mode 100644
index 000000000..8fa0fd319
--- /dev/null
+++ b/net/xl2tpd/patches/200-xl2tpd-control-fix-xl2tpd-hanged-up-in-fopen.patch
@@ -0,0 +1,92 @@
+From 97adf987cf230e47a4800c2f0a0940a1d0d98109 Mon Sep 17 00:00:00 2001
+From: wendy2001011 <wendy2001011@163.com>
+Date: Thu, 9 Feb 2017 17:32:14 +0800
+Subject: [PATCH] xl2tpd-control: fix xl2tpd hanged up in "fopen"
+
+This is a fix for xl2tpd hanged up in "fopen" result fifo while working
+on xl2tpd with OpenWrt.
+
+Root cause is as followings,
+1. xl2tpd-control open result fifo ##fifo readers=1
+2. xl2tpd-control read result fifo
+3. xl2tpd-control close result fifo ##fifo readers=0
+4. xl2tpd fopen result fifo ##xl2tpd is hanged up here to wait readers
+5. xl2tpd-control unlink result fifo
+
+The fix replaces the order of "unlink" and "close" when cleaning up to
+avoid hang up issue in fopen, and add the retry waiting when reading
+result fifo.
+
+[Yousong Zhou: 2s as the timeout and 10ms as the check interval]
+---
+ xl2tpd-control.c | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+diff --git a/xl2tpd-control.c b/xl2tpd-control.c
+index 9fcab76..b8bf822 100644
+--- a/xl2tpd-control.c
++++ b/xl2tpd-control.c
+@@ -35,6 +35,7 @@
+
+ #define TUNNEL_REQUIRED 1
+ #define TUNNEL_NOT_REQUIRED 0
++#define TIMEOUT 2000000 //timeout is 2s
+
+ char result_filename[128];
+ int result_fd = -1;
+@@ -149,9 +150,9 @@ void help()
+ void cleanup(void)
+ {
+ /* cleaning up */
+- if (result_fd >= 0)
+- close (result_fd);
+ unlink (result_filename);
++ if (result_fd >= 0)
++ close (result_fd);
+ }
+
+ int main (int argc, char *argv[])
+@@ -340,6 +341,7 @@ void print_error (int level, const char *fmt, ...)
+ va_end (args);
+ }
+
++
+ int read_result(int result_fd, char* buf, ssize_t size)
+ {
+ /* read result from result_fd */
+@@ -348,6 +350,11 @@ int read_result(int result_fd, char* buf, ssize_t size)
+ */
+ ssize_t readed = 0;
+ ssize_t len;
++ int write_pipe = 0;
++ struct timeval tvs;
++ struct timeval tve;
++ unsigned long diff;
++ gettimeofday(&tvs, NULL);
+
+ do
+ {
+@@ -360,8 +367,20 @@ int read_result(int result_fd, char* buf, ssize_t size)
+ "error: can't read command result: %s\n", strerror (errno));
+ break;
+ } else if (len == 0) {
++ if(!write_pipe) {
++ gettimeofday(&tve, NULL);
++ diff = (tve.tv_sec - tvs.tv_sec) * 1000000 + (tve.tv_usec - tvs.tv_usec);
++ if (diff >= TIMEOUT) {
++ print_error (DEBUG_LEVEL, "error: read timout\n");
++ break;
++ } else {
++ usleep(10000);
++ continue;
++ }
++ }
+ break;
+ } else {
++ write_pipe = 1;
+ readed += len;
+ if ((size - readed) <= 0)
+ break;
+--
+2.6.4
+