summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp/ipcp_opt_ipaddr.c
diff options
context:
space:
mode:
authorKozlov Dmitry <dima@server>2010-09-09 18:26:02 +0400
committerKozlov Dmitry <dima@server>2010-09-09 18:29:47 +0400
commit35d38d2c3f3db22216d43604b8750ecb6089e525 (patch)
treef599fea448c4aacdd96cabf10fee88aa7bdb57aa /accel-pptpd/ppp/ipcp_opt_ipaddr.c
parenteac0adf4b2b038690c761a126cb3e55a888060df (diff)
downloadaccel-ppp-35d38d2c3f3db22216d43604b8750ecb6089e525.tar.gz
accel-ppp-35d38d2c3f3db22216d43604b8750ecb6089e525.zip
iprange: implemneted modules iprange to validate ip addresses of controlling connection and tunnel
It will check that ip address of tunnel is not in range of clients ip addresses. This will avoid kernel softlockups due to loopback occured.
Diffstat (limited to 'accel-pptpd/ppp/ipcp_opt_ipaddr.c')
-rw-r--r--accel-pptpd/ppp/ipcp_opt_ipaddr.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/accel-pptpd/ppp/ipcp_opt_ipaddr.c b/accel-pptpd/ppp/ipcp_opt_ipaddr.c
index ddfb3d20..6e52cfab 100644
--- a/accel-pptpd/ppp/ipcp_opt_ipaddr.c
+++ b/accel-pptpd/ppp/ipcp_opt_ipaddr.c
@@ -10,6 +10,7 @@
#include "ppp_ipcp.h"
#include "log.h"
#include "ipdb.h"
+#include "iprange.h"
static struct ipcp_option_t *ipaddr_init(struct ppp_ipcp_t *ipcp);
static void ipaddr_free(struct ppp_ipcp_t *ipcp, struct ipcp_option_t *opt);
@@ -65,6 +66,14 @@ static int ipaddr_send_conf_req(struct ppp_ipcp_t *ipcp, struct ipcp_option_t *o
log_warn("ppp:ipcp: no free IP address\n");
return -1;
}
+ if (!iprange_client_check(ipaddr_opt->peer_addr)) {
+ log_warn("ppp:ipcp: to avoid hard loops requested IP cannot be assigned (%i.%i.%i.%i)\n",
+ ipaddr_opt->peer_addr&0xff,
+ (ipaddr_opt->peer_addr >> 8)&0xff,
+ (ipaddr_opt->peer_addr >> 16)&0xff,
+ (ipaddr_opt->peer_addr >> 24)&0xff);
+ return -1;
+ }
opt32->hdr.id=CI_ADDR;
opt32->hdr.len=6;