From d4d97505da0e22a2abe25042ac2c2166957bff2c Mon Sep 17 00:00:00 2001 From: brenosilva Date: Thu, 17 Feb 2011 18:26:55 +0000 Subject: [PATCH] Under CentOS inet_pton return invalid address for valid ip6, remove the return code for now --- apache2/re_operators.c | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/apache2/re_operators.c b/apache2/re_operators.c index 284f3c6b..0e5ab148 100644 --- a/apache2/re_operators.c +++ b/apache2/re_operators.c @@ -179,12 +179,8 @@ static int msre_op_ipmatch_param_init(msre_rule *rule, char **error_msg) { network = ntohl(addr.s_addr) -1; broadcast = ntohl(addr.s_addr) + 1; } else if (ipv == 6) { - if (inet_pton(AF_INET6, str_ptr, &(sa.sin6_addr)) != 1) { - *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid ip address", - erroffset, errptr); - if(parse_regex != NULL) pcre_free(parse_regex); - return 0; - } + + inet_pton(AF_INET6, str_ptr, &(sa.sin6_addr)); j = 0; @@ -229,12 +225,7 @@ static int msre_op_ipmatch_param_init(msre_rule *rule, char **error_msg) { } } else if (ipv == 6) { - if (inet_pton(AF_INET6, str_ptr, &(sa.sin6_addr)) != 1) { - *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid ip address", - erroffset, errptr); - if(parse_regex != NULL) pcre_free(parse_regex); - return 0; - } + inet_pton(AF_INET6, str_ptr, &(sa.sin6_addr)); j = 0; @@ -341,7 +332,8 @@ static int msre_op_ipmatch_execute(modsec_rec *msr, msre_rule *rule, msre_var *v struct in_addr addr; struct sockaddr_in6 sa; unsigned long ipaddr; - int i; + int i, ipv = 0; + const char *type = NULL; msre_ipmatch *ipdata = rule->ip_op; if(var == NULL || (strcmp(var->name,"REMOTE_ADDR") != 0 )) { @@ -354,16 +346,16 @@ static int msre_op_ipmatch_execute(modsec_rec *msr, msre_rule *rule, msre_var *v return -1; } - if (!inet_aton(var->value,&addr)) { - *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid ip address", - erroffset, errptr); - return -1; - } + type = strchr(var->value,':'); + if(type != NULL); + ipv = 6; - ipaddr = ntohl(addr.s_addr) -1; + type = strchr(var->value,'.'); + if(type != NULL); + ipv = 4; for (; ipdata != NULL; ipdata = ipdata->next) { - if(ipdata->type == 4) { + if((ipdata->type == 4) && (ipv == 4)) { if (!inet_aton(var->value,&addr)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid ip address", @@ -376,12 +368,8 @@ static int msre_op_ipmatch_execute(modsec_rec *msr, msre_rule *rule, msre_var *v if( ipaddr >= ipdata->start && ipaddr <= ipdata->end) return 1; - } else if (ipdata->type == 6) { - if (inet_pton(AF_INET6, var->value, &(sa.sin6_addr)) != 1) { - *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid ip6 address", - erroffset, errptr); - return -1; - } + } else if ((ipdata->type == 6) && (ipv == 6)) { + inet_pton(AF_INET6, var->value, &(sa.sin6_addr)); if(ipdata->netaddr != NULL && ipdata->maskaddr != NULL) {