Fix for OpenJdk SocketImpl.
OpenJdk sockets start their life with a null FileDescriptor.
b/25805791 tracks fixing the SocketImpl
Change-Id: Ia14afda04aa0a109f944c549719ad50bb3aeadab
diff --git a/src/compat/java/org/conscrypt/Platform.java b/src/compat/java/org/conscrypt/Platform.java
index 7df17f7..dd0199d 100644
--- a/src/compat/java/org/conscrypt/Platform.java
+++ b/src/compat/java/org/conscrypt/Platform.java
@@ -66,7 +66,12 @@
Class<?> c_socketImpl = Class.forName("java.net.SocketImpl");
Field f_fd = c_socketImpl.getDeclaredField("fd");
f_fd.setAccessible(true);
- return (FileDescriptor) f_fd.get(socketImpl);
+ // OpenJdk sockets start their life with a null FD.
+ FileDescriptor ret = (FileDescriptor) f_fd.get(socketImpl);
+ if (ret == null) {
+ ret = new FileDescriptor();
+ }
+ return ret;
} catch (Exception e) {
throw new RuntimeException("Can't get FileDescriptor from socket", e);
}
diff --git a/src/platform/java/org/conscrypt/Platform.java b/src/platform/java/org/conscrypt/Platform.java
index fde9acb..8b9d85e 100644
--- a/src/platform/java/org/conscrypt/Platform.java
+++ b/src/platform/java/org/conscrypt/Platform.java
@@ -81,7 +81,11 @@
}
public static FileDescriptor getFileDescriptor(Socket s) {
- return s.getFileDescriptor$();
+ FileDescriptor ret = s.getFileDescriptor$();
+ if (ret == null) {
+ return new FileDescriptor();
+ }
+ return ret;
}
public static FileDescriptor getFileDescriptorFromSSLSocket(OpenSSLSocketImpl openSSLSocketImpl) {
@@ -91,7 +95,12 @@
Object socketImpl = f_impl.get(openSSLSocketImpl);
Field f_fd = SocketImpl.class.getDeclaredField("fd");
f_fd.setAccessible(true);
- return (FileDescriptor) f_fd.get(socketImpl);
+ // OpenJdk sockets start their life with a null FD.
+ FileDescriptor ret = (FileDescriptor) f_fd.get(socketImpl);
+ if (ret == null) {
+ ret = new FileDescriptor();
+ }
+ return ret;
} catch (Exception e) {
throw new RuntimeException("Can't get FileDescriptor from socket", e);
}