From 18fdf802d31354c62a27cc5a63b196780a0d486e Mon Sep 17 00:00:00 2001
|
|
From: Yousong Zhou <yszhou4tech@gmail.com>
|
|
Date: Wed, 29 Apr 2015 16:30:17 +0800
|
|
Subject: [PATCH 206/210] xl2tpd: start_pppd: place opts after "plugin
|
|
pppol2tp.so".
|
|
|
|
so that plugin options like pppol2tp_debug_mark can be recognized by
|
|
pppd. While doing this also add bound check to prevent potential buffer
|
|
overflow problem.
|
|
---
|
|
xl2tpd.c | 22 +++++++++++-----------
|
|
1 file changed, 11 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/xl2tpd.c b/xl2tpd.c
|
|
index 6c945fc..017adfd 100644
|
|
--- a/xl2tpd.c
|
|
+++ b/xl2tpd.c
|
|
@@ -382,7 +382,6 @@ int start_pppd (struct call *c, struct ppp_opts *opts)
|
|
/* 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 ppp_opts *opts)
|
|
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 ppp_opts *opts)
|
|
snprintf (stropt[pos], 10, "%d", c->ourcid);
|
|
pos++;
|
|
}
|
|
- stropt[pos] = NULL;
|
|
}
|
|
else
|
|
#endif
|
|
@@ -497,6 +486,17 @@ int start_pppd (struct call *c, struct ppp_opts *opts)
|
|
return -EINVAL;
|
|
}
|
|
stropt[pos++] = strdup(tty);
|
|
+ }
|
|
+
|
|
+ {
|
|
+ struct ppp_opts *p = opts;
|
|
+ int maxn_opts = sizeof(stropt) / sizeof(stropt[0]) - 1;
|
|
+ while (p && pos < maxn_opts)
|
|
+ {
|
|
+ stropt[pos] = strdup (p->option);
|
|
+ pos++;
|
|
+ p = p->next;
|
|
+ }
|
|
stropt[pos] = NULL;
|
|
}
|
|
|
|
--
|
|
1.7.10.4
|
|
|