diff --git a/ipcalc b/ipcalc index f958f8a..02a7a51 100755 --- a/ipcalc +++ b/ipcalc @@ -168,7 +168,11 @@ EOF # get netmasks if ($ipv6) { if (defined $ARGV[1]) { - $mask1 = $ARGV[1]; + $mask1 = check_mask6($ARGV[1]); + if ($mask1 == -1) { + print "INVALID MASK1\n\n"; + exit; + } } else { $mask1 = 64; } @@ -199,6 +203,8 @@ EOF print set_color($error_color); } print "$error\n"; + print set_color($norml_color); + exit; } # print "Address: ".ntoa($address)."\n"; @@ -1089,7 +1095,7 @@ sub ip6ton my $test = $arg; $test =~ s/[0-9a-f:]//g; if ($test ne '') { -print "Illegal chars\n"; +###print "Illegal chars\n"; return -1; } $test = $arg; @@ -1109,7 +1115,7 @@ print "Illegal chars\n"; #print "- '$slice'\n"; if ($slice eq '') { if ($compressed) { -print "multiple ::\n"; +###print "multiple ::\n"; return -1; } for (my $i=0;$i<8-$#tmp;$i++) { @@ -1149,6 +1155,15 @@ sub prefixlenton return $n; } +sub check_mask6 +{ + my $mask = shift; + if ($mask !~ /^\d{1,3}$/ || $mask < 0 || $mask > 128) { + return -1; + } + return $mask; +} + sub argton # expects 1. an address as dotted decimals, bit-count-mask, or hex # 2. netmask flag. if set -> check netmask and negate wildcard @@ -1188,25 +1203,26 @@ sub argton # bit-count-mask (24 or /24) $arg =~ s/^\/(\d+)$/$1/; + # ipv6 + # for ipv6 this code is never reached: if ($ipv6) { - if ($arg =~ /^\d{1,3}$/) { - if ($arg < 0 || $arg > 128) { - return -1; - } - return prefixlenton($arg); + if ($arg !~ /^\d{1,3}$/ || $arg < 0 || $arg > 128) { + return -1; } - } else { - if ($arg =~ /^\d{1,2}$/) { - if ($arg < 0 || $arg > 32) { - return -1; - } - for ($i=0;$i<$arg;$i++) { - $n |= 1 << (31-$i); - } - return $n; + return prefixlenton($arg); + } + # ipv4 + if ($arg =~ /^\d{1,2}$/) { + if ($arg < 0 || $arg > 32) { + return -1; } + for ($i=0;$i<$arg;$i++) { + $n |= 1 << (31-$i); + } + return $n; } + # hex if ($arg =~ /^[0-9A-Fa-f]{8}$/ || $arg =~ /^0x[0-9A-Fa-f]{8}$/ ) {