Index: trunk/src/cutest_sh_tools.c
===================================================================
--- trunk/src/cutest_sh_tools.c	(revision 448)
+++ trunk/src/cutest_sh_tools.c	(revision 449)
@@ -115,4 +115,24 @@
   input  = strdup("127");
   CuAssertTrue(tc, !sh_ipvx_is_numeric(input));
+#if defined(USE_IPVX)
+  input  = strdup("::1");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+  input  = strdup("2002:c0a8:101::42");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+  input  = strdup("2003:dead:beef:4dad:23:46:bb:101");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+  input  = strdup("::192:168:0:1::");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+  input  = strdup("1:1:192:168:0:1:1:1");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+  input  = strdup("1:1:192:168:0:1:1:1:0");
+  CuAssertTrue(tc, !sh_ipvx_is_numeric(input));
+  input  = strdup("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+  input  = strdup("2001:db8:85a3:0:0:8a2e:370:7334");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+  input  = strdup("2001:db8:85a3::8a2e:370:7334");
+  CuAssertTrue(tc, sh_ipvx_is_numeric(input));
+#endif
 }
 
Index: trunk/src/sh_ipvx.c
===================================================================
--- trunk/src/sh_ipvx.c	(revision 448)
+++ trunk/src/sh_ipvx.c	(revision 449)
@@ -82,7 +82,10 @@
     else if (c == ':')
       ++k;
-    else if (c == '.' && k < 3)
+    else if (c == '.' && k < 2)
       return (1 == 0); /* ::ffff:ipv4 */
   }
+  if (k < 2 || k > 7)
+    return (1 == 0);
+
   return (1 == 1);
 }
