Merge "Fix Os.inet_pton for IPv6."
diff --git a/luni/src/main/native/libcore_io_Linux.cpp b/luni/src/main/native/libcore_io_Linux.cpp
index 4072b6b..38b1392 100644
--- a/luni/src/main/native/libcore_io_Linux.cpp
+++ b/luni/src/main/native/libcore_io_Linux.cpp
@@ -1718,8 +1718,14 @@
}
sockaddr_storage ss;
memset(&ss, 0, sizeof(ss));
- // sockaddr_in and sockaddr_in6 are at the same address, so we can use either here.
- void* dst = &reinterpret_cast<sockaddr_in*>(&ss)->sin_addr;
+ void* dst;
+ if (family == AF_INET) {
+ dst = &reinterpret_cast<sockaddr_in*>(&ss)->sin_addr;
+ } else if (family == AF_INET6) {
+ dst = &reinterpret_cast<sockaddr_in6*>(&ss)->sin6_addr;
+ } else {
+ return NULL;
+ }
if (inet_pton(family, name.c_str(), dst) != 1) {
return NULL;
}
diff --git a/luni/src/test/java/libcore/libcore/io/OsTest.java b/luni/src/test/java/libcore/libcore/io/OsTest.java
index 557b640..604ff88 100644
--- a/luni/src/test/java/libcore/libcore/io/OsTest.java
+++ b/luni/src/test/java/libcore/libcore/io/OsTest.java
@@ -1316,4 +1316,34 @@
assertFalse(Os.compareAndSetDefault(otherOs, otherOs));
assertSame(defaultOs, Os.getDefault());
}
+
+ public void testInetPtonIpv4() {
+ String srcAddress = "127.0.0.1";
+ InetAddress inetAddress = Libcore.rawOs.inet_pton(AF_INET, srcAddress);
+ assertEquals(srcAddress, inetAddress.getHostAddress());
+ }
+
+ public void testInetPtonIpv6() {
+ String srcAddress = "1123:4567:89ab:cdef:fedc:ba98:7654:3210";
+ InetAddress inetAddress = Libcore.rawOs.inet_pton(AF_INET6, srcAddress);
+ assertEquals(srcAddress, inetAddress.getHostAddress());
+ }
+
+ public void testInetPtonInvalidFamily() {
+ String srcAddress = "127.0.0.1";
+ InetAddress inetAddress = Libcore.rawOs.inet_pton(AF_UNIX, srcAddress);
+ assertNull(inetAddress);
+ }
+
+ public void testInetPtonWrongFamily() {
+ String srcAddress = "127.0.0.1";
+ InetAddress inetAddress = Libcore.rawOs.inet_pton(AF_INET6, srcAddress);
+ assertNull(inetAddress);
+ }
+
+ public void testInetPtonInvalidData() {
+ String srcAddress = "10.1";
+ InetAddress inetAddress = Libcore.rawOs.inet_pton(AF_INET, srcAddress);
+ assertNull(inetAddress);
+ }
}