summaryrefslogtreecommitdiff
path: root/accel-pppd/radius
diff options
context:
space:
mode:
authorGuillaume Nault <g.nault@alphalink.fr>2018-11-07 19:28:58 +0100
committerDmitry Kozlov <xeb@mail.ru>2018-11-12 17:00:38 +0300
commitc3710b6bca55450339bd882207eaf180d5674dab (patch)
tree6ed054091e85d1f98d58b9fbaa1edab5c4013f47 /accel-pppd/radius
parent1c40018e238dc27c9428631cf71633f218bd7824 (diff)
downloadaccel-ppp-xebd-c3710b6bca55450339bd882207eaf180d5674dab.tar.gz
accel-ppp-xebd-c3710b6bca55450339bd882207eaf180d5674dab.zip
ipcp: fix uninitialised memory access when negociating *-NBNS-Address
When handling the EV_WINS event, IPCP assumes that the ->wins1 and ->wins2 fields of the event structure are properly set. But that may not be the case. If only one of the MS-Primary-NBNS-Server or MS-Secondary-NBNS-Server RADIUS attributes was received, then only ->wins1 or ->wins2 is set, while the other keeps a non initialised value. This uninitialised value is then copied by ev_wins() and proposed to the peer when negociating the Primary-NBNS-Address or Secondary-NBNS-Address IPCP options. That leaks four bytes of the stack to the network and prevents using the values found in the [wins] section of accel-ppp.conf as fallback. Fix this by initialising the whole event structure in rad_proc_attrs(). Then, in ev_wins(), we can check if ->wins1 or ->wins2 is properly set before copying them. That allows to propery fallback to accel-ppp.conf values when one of the values was not provided by RADIUS. Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Diffstat (limited to 'accel-pppd/radius')
-rw-r--r--accel-pppd/radius/radius.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c
index 5e8196d..dd05b83 100644
--- a/accel-pppd/radius/radius.c
+++ b/accel-pppd/radius/radius.c
@@ -148,14 +148,13 @@ out_err:
int rad_proc_attrs(struct rad_req_t *req)
{
+ struct ev_wins_t wins = {};
struct ev_dns_t dns = {};
struct rad_attr_t *attr;
struct ipv6db_addr_t *a;
- struct ev_wins_t wins;
int res = 0;
struct radius_pd_t *rpd = req->rpd;
- wins.ses = NULL;
req->rpd->acct_interim_interval = conf_acct_interim_interval;
list_for_each_entry(attr, &req->reply->attrs, entry) {