Index: src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java =================================================================== --- src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java (revision 491827) +++ src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java (working copy) @@ -218,6 +218,15 @@ // ia2.getHostName().startsWith(Support_Configuration.InetTestAddress)); // TODO : Test to ensure all the address formats are recognized + InetAddress i = InetAddress.getByName("1.2.3"); + assertEquals("1.2.0.3",i.getHostAddress()); + i = InetAddress.getByName("1.2"); + assertEquals("1.0.0.2",i.getHostAddress()); + i = InetAddress.getByName(String.valueOf(0xffffffffL)); + assertEquals("255.255.255.255",i.getHostAddress()); + String s = "222.222.222.222...."; + i = InetAddress.getByName(s); + assertEquals("222.222.222.222",i.getHostAddress()); } /** Index: src/main/java/java/net/InetAddress.java =================================================================== --- src/main/java/java/net/InetAddress.java (revision 491827) +++ src/main/java/java/net/InetAddress.java (working copy) @@ -1137,20 +1137,31 @@ InetAddress address = null; if (Inet6Util.isValidIPV4Address(ipAddressString)) { - - StringTokenizer tokenizer = new StringTokenizer(ipAddressString, - "."); - String token = ""; - int tempInt = 0; - byte[] byteAddress = new byte[4]; - for (int i = 0; i < 4; i++) { - token = tokenizer.nextToken(); - tempInt = Integer.parseInt(token); - byteAddress[i] = (byte) tempInt; - } - - address = new Inet4Address(byteAddress); - + byte[] byteAddress = new byte[4]; + String[] parts = ipAddressString.split("\\."); + int length = parts.length; + if (length == 1) { + Long value = Long.parseLong(parts[0]); + for (int i = 0; i < 4; i++) { + byteAddress[i] = (byte) (value>>((3-i)*8)); + } + } else { + for (int i = 0; i < length; i++) { + byteAddress[i]=(byte)Integer.parseInt(parts[i]); + } + } + + // adjust for 2/3 parts address + if(length == 2){ + byteAddress[3]=byteAddress[1]; + byteAddress[1]=0; + } + if(length == 3){ + byteAddress[3]=byteAddress[2]; + byteAddress[2]=0; + } + + address = new Inet4Address(byteAddress); } else { // otherwise it must be ipv6 if (ipAddressString.charAt(0) == '[') { Index: src/main/java/org/apache/harmony/luni/util/Inet6Util.java =================================================================== --- src/main/java/org/apache/harmony/luni/util/Inet6Util.java (revision 491827) +++ src/main/java/org/apache/harmony/luni/util/Inet6Util.java (working copy) @@ -465,47 +465,29 @@ * notation, false otherwise */ public static boolean isValidIPV4Address(String value) { - - int periods = 0; - int i = 0; - int length = value.length(); - - if (length > 15) { + // general test + if (!value.matches("[\\p{Digit}\\.]*")) { return false; } - char c = 0; - String word = ""; - for (i = 0; i < length; i++) { - c = value.charAt(i); - if (c == '.') { - periods++; - if (periods > 3) { - return false; - } - if (word == "") { - return false; - } - if (Integer.parseInt(word) > 255) { - return false; - } - word = ""; - } else if (!(Character.isDigit(c))) { - return false; - } else { - if (word.length() > 2) { - return false; - } - word += c; - } - } - if (word == "" || Integer.parseInt(word) > 255) { + String[] parts = value.split("\\."); + int length = parts.length; + if (length > 4) { return false; } - if (periods != 3) { - return false; + + // for one part + if (parts.length == 1) { + long longValue = Long.parseLong(parts[0]); + return longValue >= 0 && longValue <= 0xFFFFFFFFL; } - return true; + // test every parts + for (int i = 0; i < parts.length; i++) { + if (parts[i].length() > 3 || Integer.parseInt(parts[i]) > 255) { + return false; + } + } + return true; } }