From: <ow...@us...> - 2010-10-30 22:33:21
|
Revision: 5079 http://ipcop.svn.sourceforge.net/ipcop/?rev=5079&view=rev Author: owes Date: 2010-10-30 22:33:15 +0000 (Sat, 30 Oct 2010) Log Message: ----------- Improve the IP address test, entering an invalid IP during installation could leave us with a broken system. TODO: improve the network mask validation. Modified Paths: -------------- ipcop/trunk/src/installer/common.h ipcop/trunk/src/installer/helper.c ipcop/trunk/src/installer/helper_newt.c Modified: ipcop/trunk/src/installer/common.h =================================================================== --- ipcop/trunk/src/installer/common.h 2010-10-30 16:13:46 UTC (rev 5078) +++ ipcop/trunk/src/installer/common.h 2010-10-30 22:33:15 UTC (rev 5079) @@ -196,10 +196,7 @@ #define VALID_FQDN LETTERS_NUMBERS ".-" -#define VALID_IP(ip) (strlen(ip) > 6 \ - && strlen(ip) < 16 \ - && strspn(ip, NUMBERS ".") == strlen(ip)) - +int VALID_IP(const char *ip); #define VALID_IP_AND_MASK(ip) (strlen(ip) > 6 \ && strlen(ip) < 32 \ && strspn(ip, IP_NUMBERS) == strlen(ip)) Modified: ipcop/trunk/src/installer/helper.c =================================================================== --- ipcop/trunk/src/installer/helper.c 2010-10-30 16:13:46 UTC (rev 5078) +++ ipcop/trunk/src/installer/helper.c 2010-10-30 22:33:15 UTC (rev 5079) @@ -703,7 +703,25 @@ return module_buffer; } +/* + Test for valid IPv4 + Returns TRUE or FALSE +*/ +int VALID_IP(const char *ip) +{ + unsigned int b1, b2, b3, b4; + unsigned char c; + if ((strlen(ip) < 7) || (strlen(ip) > 15)) return FALSE; + if (strspn(ip, NUMBERS ".") != strlen(ip)) return FALSE; + if (sscanf(ip, "%3u.%3u.%3u.%3u%c", &b1, &b2, &b3, &b4, &c) != 4) return FALSE; + + if ((b1 | b2 | b3 | b4) > 255) return FALSE; + + return TRUE; +} + + #ifdef TEST int main(void) { Modified: ipcop/trunk/src/installer/helper_newt.c =================================================================== --- ipcop/trunk/src/installer/helper_newt.c 2010-10-30 16:13:46 UTC (rev 5078) +++ ipcop/trunk/src/installer/helper_newt.c 2010-10-30 22:33:15 UTC (rev 5079) @@ -228,9 +228,14 @@ newtFormAddComponent(networkform, netmaskentry); ok = newtButton(6, 5 + numLines, gettext("TR_OK")); - cancel = newtButton(26, 5 + numLines, gettext("TR_GO_BACK")); - newtFormAddComponents(networkform, ok, cancel, NULL); - + /* In case of installer we need a valid address, no turning back */ + if (flag_is_state == setupchroot) { + newtFormAddComponent(networkform, ok); + } + else { + cancel = newtButton(26, 5 + numLines, gettext("TR_GO_BACK")); + newtFormAddComponents(networkform, ok, cancel, NULL); + } newtRefresh(); newtDrawForm(networkform); @@ -241,13 +246,15 @@ if (exitstruct.u.co == ok) { strcpy(message, gettext("TR_INVALID_FIELDS")); - if (inet_addr(addressresult) == INADDR_NONE) { + if (VALID_IP(addressresult) == FALSE) { strcat(message, gettext("TR_IP_ADDRESS_CR")); error = 1; + newtFormSetCurrent(networkform, addressentry); } - if (inet_addr(netmaskresult) == INADDR_NONE) { + if (VALID_IP(netmaskresult) == FALSE) { strcat(message, gettext("TR_NETWORK_MASK_CR")); error = 1; + newtFormSetCurrent(networkform, netmaskentry); } // TODO: additional network mask validation This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |