From e88d8fd019047f685bf14962aec619f70705f4ec Mon Sep 17 00:00:00 2001 From: marschap Date: Thu, 15 Dec 2005 12:04:53 +0000 Subject: [PATCH] correct IP address verification; continue correctly even if it fails --- server/menuitem.c | 33 ++++++++++++++++++--------------- server/sock.c | 2 ++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/server/menuitem.c b/server/menuitem.c index c3639b5..f851492 100644 --- a/server/menuitem.c +++ b/server/menuitem.c @@ -395,15 +395,17 @@ MenuItem *menuitem_create_ip (char *id, MenuEventFunc(*event_func), new_item->data.ip.maxlength = ipinfo->maxlen;; new_item->data.ip.value = malloc (new_item->data.ip.maxlength + 1); - if (ipinfo->verify(value)) { - strncpy(new_item->data.ip.value, value, new_item->data.ip.maxlength); - new_item->data.ip.value[new_item->data.ip.maxlength] = '\0'; - } - else { - report(RPT_WARNING, "%s(id=\"%s\") ip address not verified: \"%s\"", - __FUNCTION__, id, value); - strncpy(new_item->data.ip.value, ipinfo->dummy, new_item->data.ip.maxlength); - new_item->data.ip.value[new_item->data.ip.maxlength] = '\0'; + if (ipinfo->verify) { + if (ipinfo->verify(value)) { + strncpy(new_item->data.ip.value, value, new_item->data.ip.maxlength); + new_item->data.ip.value[new_item->data.ip.maxlength] = '\0'; + } + else { + report(RPT_WARNING, "%s(id=\"%s\") ip address not verified: \"%s\"", + __FUNCTION__, id, value); + strncpy(new_item->data.ip.value, ipinfo->dummy, new_item->data.ip.maxlength); + new_item->data.ip.value[new_item->data.ip.maxlength] = '\0'; + } } new_item->data.ip.edit_str = malloc (new_item->data.ip.maxlength + 1); @@ -1332,9 +1334,11 @@ MenuResult menuitem_process_input_ip (MenuItem *item, MenuToken token, char * ke return MENURESULT_NONE; case MENUTOKEN_ENTER: if (extended || (pos >= item->data.ip.maxlength - 1)) { - /* ** we do not need this; the verify function is clever enough ** // remove the leading spaces/zeros in each octet-representing string - char *start = str; + char tmp[40]; // 40 = max. length of IPv4 & IPv6 addresses incl. '\0' + char *start = tmp; + + memccpy(tmp, str, '\0', sizeof(tmp)); while (start != NULL) { char *skip = start; @@ -1345,18 +1349,17 @@ MenuResult menuitem_process_input_ip (MenuItem *item, MenuToken token, char * ke skip = strchr(start, ipinfo->sep); start = (skip != NULL) ? (skip + 1) : NULL; } - */ // check IP address entered - if (!ipinfo->verify(item->data.ip.edit_str)) { + if ((ipinfo->verify) && (!ipinfo->verify(tmp))) { report(RPT_WARNING, "%s(id=\"%s\") ip address not verified: \"%s\"", - __FUNCTION__, item->id, item->data.ip.edit_str); + __FUNCTION__, item->id, tmp); item->data.ip.error_code = 4; return MENURESULT_NONE; } // store value - strcpy (item->data.ip.value, item->data.ip.edit_str); + strcpy (item->data.ip.value, tmp); // Inform client if (item->event_func) diff --git a/server/sock.c b/server/sock.c index ce08b76..f0f8c93 100644 --- a/server/sock.c +++ b/server/sock.c @@ -462,3 +462,5 @@ int verify_ipv6(const char *addr) } return (result > 0) ? 1 : 0; } + +