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);
+  }
 }