Yousong Zhou <yszhou4tech@gmail.com> made a couple of useful fixes mostly for the xl2tpd-control tool which was broken. imported them (patches/2*) here. Signed-off-by: Daniel Golle <daniel@makrotopia.org>lilik-openwrt-22.03
@ -0,0 +1,37 @@ | |||
From 8c5853b8e22f34bc1c1acba278f7850ab7946894 Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Tue, 28 Apr 2015 21:26:15 +0800 | |||
Subject: [PATCH 1/7] xl2tpd-control: check end-of-file when reading pipe to | |||
avoid dead loop. | |||
--- | |||
xl2tpd-control.c | 11 +++++++---- | |||
1 file changed, 7 insertions(+), 4 deletions(-) | |||
--- a/xl2tpd-control.c | |||
+++ b/xl2tpd-control.c | |||
@@ -306,17 +306,20 @@ int read_result(int result_fd, char* buf | |||
/*FIXME: there is a chance to hang up reading. | |||
Should I create watching thread with timeout? | |||
*/ | |||
- ssize_t readed; | |||
+ ssize_t readed = 0; | |||
+ ssize_t len; | |||
+ | |||
do | |||
{ | |||
- readed = read (result_fd, buf, size); | |||
- if (readed < 0) | |||
+ len = read (result_fd, buf + readed, size - readed); | |||
+ if (len < 0) | |||
{ | |||
print_error (ERROR_LEVEL, | |||
"error: can't read command result: %s\n", strerror (errno)); | |||
break; | |||
} | |||
- } while (readed == 0); | |||
+ readed += len; | |||
+ } while (len > 0 && (size - readed) > 0); | |||
buf[readed] = '\0'; | |||
/* scan result code */ |
@ -0,0 +1,21 @@ | |||
From 76f444d284c0b0a351a488954e0d39b72a0ce211 Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Wed, 29 Apr 2015 10:32:37 +0800 | |||
Subject: [PATCH 2/7] xl2tpd-control: define _GNU_SOURCE to use fmemopen() and | |||
friends. | |||
--- | |||
xl2tpd-control.c | 2 ++ | |||
1 file changed, 2 insertions(+) | |||
--- a/xl2tpd-control.c | |||
+++ b/xl2tpd-control.c | |||
@@ -10,6 +10,8 @@ | |||
* | |||
*/ | |||
+#define _GNU_SOURCE | |||
+ | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include <stdarg.h> |
@ -0,0 +1,37 @@ | |||
From f7cfd36b8a93afd326c0d9378e99576c616bd3fc Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Wed, 29 Apr 2015 14:21:12 +0800 | |||
Subject: [PATCH 3/7] xl2tpd-control: open control file with O_NONBLOCK. | |||
Otherwise xl2tpd-control would block indefinitely in case xl2tpd is | |||
not running. | |||
--- | |||
xl2tpd-control.c | 10 +++++++++- | |||
1 file changed, 9 insertions(+), 1 deletion(-) | |||
--- a/xl2tpd-control.c | |||
+++ b/xl2tpd-control.c | |||
@@ -246,7 +246,7 @@ int main (int argc, char *argv[]) | |||
print_error (DEBUG_LEVEL, "command to be passed:\n%s\n", buf); | |||
/* try to open control file for writing */ | |||
- int control_fd = open (control_filename, O_WRONLY, 0600); | |||
+ int control_fd = open (control_filename, O_WRONLY | O_NONBLOCK, 0600); | |||
if (control_fd < 0) | |||
{ | |||
int errorno = errno; | |||
@@ -265,6 +265,14 @@ int main (int argc, char *argv[]) | |||
} | |||
return -1; | |||
} | |||
+ | |||
+ /* turn off O_NONBLOCK */ | |||
+ if (fcntl (control_fd, F_SETFL, O_WRONLY) == -1) { | |||
+ print_error (ERROR_LEVEL, | |||
+ "Can not turn off nonblocking mode for control_fd: %s\n", | |||
+ strerror(errno)); | |||
+ return -2; | |||
+ } | |||
/* pass command to control pipe */ | |||
if (write (control_fd, buf, ftell (mesf)) < 0) |
@ -0,0 +1,62 @@ | |||
From 7a343f7b79b70a8e7e04b2bd465d344ad0ef4c49 Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Wed, 29 Apr 2015 16:30:17 +0800 | |||
Subject: [PATCH 4/7] start_pppd: place opts after "plugin pppol2tp.so". | |||
so that plugin options like pppol2tp_debug_mark can be recognized by pppd. | |||
--- | |||
xl2tpd.c | 21 ++++++++++----------- | |||
1 file changed, 10 insertions(+), 11 deletions(-) | |||
--- a/xl2tpd.c | |||
+++ b/xl2tpd.c | |||
@@ -382,7 +382,6 @@ int start_pppd (struct call *c, struct p | |||
/* char a, b; */ | |||
char tty[512]; | |||
char *stropt[80]; | |||
- struct ppp_opts *p; | |||
#ifdef USE_KERNEL | |||
struct sockaddr_pppol2tp sax; | |||
int flags; | |||
@@ -396,16 +395,7 @@ int start_pppd (struct call *c, struct p | |||
struct call *sc; | |||
struct tunnel *st; | |||
- p = opts; | |||
stropt[0] = strdup (PPPD); | |||
- while (p) | |||
- { | |||
- stropt[pos] = (char *) malloc (strlen (p->option) + 1); | |||
- strncpy (stropt[pos], p->option, strlen (p->option) + 1); | |||
- pos++; | |||
- p = p->next; | |||
- } | |||
- stropt[pos] = NULL; | |||
if (c->pppd > 0) | |||
{ | |||
l2tp_log(LOG_WARNING, "%s: PPP already started on call!\n", __FUNCTION__); | |||
@@ -467,7 +457,6 @@ int start_pppd (struct call *c, struct p | |||
snprintf (stropt[pos], 10, "%d", c->ourcid); | |||
pos++; | |||
} | |||
- stropt[pos] = NULL; | |||
} | |||
else | |||
#endif | |||
@@ -497,6 +486,16 @@ int start_pppd (struct call *c, struct p | |||
return -EINVAL; | |||
} | |||
stropt[pos++] = strdup(tty); | |||
+ } | |||
+ | |||
+ { | |||
+ struct ppp_opts *p = opts; | |||
+ while (p) | |||
+ { | |||
+ stropt[pos] = strdup (p->option); | |||
+ pos++; | |||
+ p = p->next; | |||
+ } | |||
stropt[pos] = NULL; | |||
} | |||
@ -0,0 +1,62 @@ | |||
From d4a484db1684cce15966bb722644416f90253ea7 Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Thu, 30 Apr 2015 13:53:11 +0800 | |||
Subject: [PATCH 5/7] xl2tpd-control: cleaup result file atexit(). | |||
--- | |||
xl2tpd-control.c | 20 +++++++++++++------- | |||
1 file changed, 13 insertions(+), 7 deletions(-) | |||
--- a/xl2tpd-control.c | |||
+++ b/xl2tpd-control.c | |||
@@ -35,6 +35,9 @@ | |||
#define TUNNEL_REQUIRED 1 | |||
#define TUNNEL_NOT_REQUIRED 0 | |||
+char result_filename[128]; | |||
+int result_fd = -1; | |||
+ | |||
int log_level = ERROR_LEVEL; | |||
void print_error (int level, const char *fmt, ...); | |||
@@ -117,6 +120,14 @@ void help() | |||
); | |||
} | |||
+void cleanup(void) | |||
+{ | |||
+ /* cleaning up */ | |||
+ if (result_fd >= 0) | |||
+ close (result_fd); | |||
+ unlink (result_filename); | |||
+} | |||
+ | |||
int main (int argc, char *argv[]) | |||
{ | |||
char* control_filename = NULL; | |||
@@ -195,11 +206,11 @@ int main (int argc, char *argv[]) | |||
FILE* mesf = fmemopen (buf, CONTROL_PIPE_MESSAGE_SIZE, "w"); | |||
/* create result pipe for reading */ | |||
- char result_filename[128]; | |||
snprintf (result_filename, 128, RESULT_FILENAME_FORMAT, getpid()); | |||
unlink (result_filename); | |||
mkfifo (result_filename, 0600); | |||
- int result_fd = open (result_filename, O_RDONLY | O_NONBLOCK, 0600); | |||
+ atexit(cleanup); | |||
+ result_fd = open (result_filename, O_RDONLY | O_NONBLOCK, 0600); | |||
if (result_fd < 0) | |||
{ | |||
print_error (ERROR_LEVEL, | |||
@@ -293,11 +304,6 @@ int main (int argc, char *argv[]) | |||
); | |||
printf ("%s", rbuf); | |||
- /* cleaning up */ | |||
- | |||
- close (result_fd); | |||
- unlink (result_filename); | |||
- | |||
return command_result_code; | |||
} | |||
@ -0,0 +1,22 @@ | |||
From 1e8b82388578a622c5caf8fa04c238fdd7808ecc Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Thu, 30 Apr 2015 13:53:40 +0800 | |||
Subject: [PATCH 6/7] xl2tpd: fix possible buffer overflow when filling | |||
stropt[]. | |||
--- | |||
xl2tpd.c | 3 ++- | |||
1 file changed, 2 insertions(+), 1 deletion(-) | |||
--- a/xl2tpd.c | |||
+++ b/xl2tpd.c | |||
@@ -490,7 +490,8 @@ int start_pppd (struct call *c, struct p | |||
{ | |||
struct ppp_opts *p = opts; | |||
- while (p) | |||
+ int maxn_opts = sizeof(stropt) / sizeof(stropt[0]) - 1; | |||
+ while (p && pos < maxn_opts) | |||
{ | |||
stropt[pos] = strdup (p->option); | |||
pos++; |
@ -0,0 +1,21 @@ | |||
From 44ced2bbf1d6b39bb36c3cb8be6e40c8764e2e8a Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Thu, 30 Apr 2015 13:57:36 +0800 | |||
Subject: [PATCH 7/7] l2tp_log: remove log prefix that will duplicate with | |||
procd. | |||
--- | |||
misc.c | 2 +- | |||
1 file changed, 1 insertion(+), 1 deletion(-) | |||
--- a/misc.c | |||
+++ b/misc.c | |||
@@ -61,7 +61,7 @@ void l2tp_log (int level, const char *fm | |||
init_log(); | |||
SYSLOG_CALL( syslog (level, "%s", buf) ); | |||
} else { | |||
- fprintf(stderr, "xl2tpd[%d]: %s", getpid(), buf); | |||
+ fprintf(stderr, "%s", buf); | |||
} | |||
} | |||