diff options
| author | 2018-07-20 21:49:00 -0700 | |
|---|---|---|
| committer | 2018-07-20 21:49:00 -0700 | |
| commit | c671d623c4b9f2edce7516e6343f6bb16d1573bd (patch) | |
| tree | 4c2963a8900cc2b7eb8d7290f96771a1596dd58e | |
| parent | a31b0cf871e8db41f39f9fa73a08b6aeba1c9dc1 (diff) | |
| parent | f28713990b89e1749bf475d7867649e985842158 (diff) | |
Merge changes from topic "bionic_fdsan_java" am: bb352287c9 am: 1fad55e868
am: f28713990b
Change-Id: I2f55eca5d6d2301905f37200f083949972170e40
| -rw-r--r-- | core/java/android/os/Parcel.java | 14 | ||||
| -rw-r--r-- | core/java/android/os/ParcelFileDescriptor.java | 9 | ||||
| -rw-r--r-- | core/jni/android_os_Parcel.cpp | 88 | ||||
| -rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 6 |
4 files changed, 13 insertions, 104 deletions
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 3bf170980e29..c7ebc8905692 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -38,7 +38,6 @@ import libcore.util.SneakyThrow; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -2074,19 +2073,6 @@ public final class Parcel { } } - /** @deprecated use {@link android.system.Os#open(String, int, int)} */ - @Deprecated - static native FileDescriptor openFileDescriptor(String file, int mode) - throws FileNotFoundException; - - /** @deprecated use {@link android.system.Os#dup(FileDescriptor)} */ - @Deprecated - static native FileDescriptor dupFileDescriptor(FileDescriptor orig) throws IOException; - - /** @deprecated use {@link android.system.Os#close(FileDescriptor)} */ - @Deprecated - static native void closeFileDescriptor(FileDescriptor desc) throws IOException; - /** * Read a byte value from the parcel at the current dataPosition(). */ diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 7556f0921b4d..c9edc531d134 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -188,7 +188,13 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } mWrapped = null; mFd = fd; + IoUtils.setFdOwner(mFd, this); + mCommFd = commChannel; + if (mCommFd != null) { + IoUtils.setFdOwner(mCommFd, this); + } + mGuard.open("close"); } @@ -682,8 +688,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { if (mClosed) { throw new IllegalStateException("Already closed"); } - final int fd = getFd(); - mFd.setInt$(-1); + int fd = IoUtils.acquireRawFd(mFd); writeCommStatusAndClose(Status.DETACHED, null); mClosed = true; mGuard.close(); diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index 5e2cd4001d23..bed239f97951 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -470,90 +470,6 @@ static jobject android_os_Parcel_readFileDescriptor(JNIEnv* env, jclass clazz, j return NULL; } -static jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jclass clazz, - jstring name, jint mode) -{ - if (name == NULL) { - jniThrowNullPointerException(env, NULL); - return NULL; - } - ScopedUtfChars name8(env, name); - if (name8.c_str() == NULL) { - return NULL; - } - - int flags=0; - switch (mode&0x30000000) { - case 0: - case 0x10000000: - flags = O_RDONLY; - break; - case 0x20000000: - flags = O_WRONLY; - break; - case 0x30000000: - flags = O_RDWR; - break; - } - - if (mode&0x08000000) flags |= O_CREAT; - if (mode&0x04000000) flags |= O_TRUNC; - if (mode&0x02000000) flags |= O_APPEND; - - int realMode = S_IRWXU|S_IRWXG; - if (mode&0x00000001) realMode |= S_IROTH; - if (mode&0x00000002) realMode |= S_IWOTH; - - int fd = open(name8.c_str(), flags, realMode); - if (fd < 0) { - jniThrowException(env, "java/io/FileNotFoundException", strerror(errno)); - return NULL; - } - jobject object = jniCreateFileDescriptor(env, fd); - if (object == NULL) { - close(fd); - } - return object; -} - -static jobject android_os_Parcel_dupFileDescriptor(JNIEnv* env, jclass clazz, jobject orig) -{ - if (orig == NULL) { - jniThrowNullPointerException(env, NULL); - return NULL; - } - int origfd = jniGetFDFromFileDescriptor(env, orig); - if (origfd < 0) { - jniThrowException(env, "java/lang/IllegalArgumentException", "bad FileDescriptor"); - return NULL; - } - - int fd = dup(origfd); - if (fd < 0) { - jniThrowIOException(env, errno); - return NULL; - } - jobject object = jniCreateFileDescriptor(env, fd); - if (object == NULL) { - close(fd); - } - return object; -} - -static void android_os_Parcel_closeFileDescriptor(JNIEnv* env, jclass clazz, jobject object) -{ - if (object == NULL) { - jniThrowNullPointerException(env, NULL); - return; - } - int fd = jniGetFDFromFileDescriptor(env, object); - if (fd >= 0) { - jniSetFileDescriptorOfFD(env, object, -1); - //ALOGI("Closing ParcelFileDescriptor %d\n", fd); - close(fd); - } -} - static jlong android_os_Parcel_create(JNIEnv* env, jclass clazz) { Parcel* parcel = new Parcel(); @@ -796,10 +712,6 @@ static const JNINativeMethod gParcelMethods[] = { {"nativeReadStrongBinder", "(J)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder}, {"nativeReadFileDescriptor", "(J)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor}, - {"openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor}, - {"dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_dupFileDescriptor}, - {"closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor}, - {"nativeCreate", "()J", (void*)android_os_Parcel_create}, {"nativeFreeBuffer", "(J)J", (void*)android_os_Parcel_freeBuffer}, {"nativeDestroy", "(J)V", (void*)android_os_Parcel_destroy}, diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index e30a3e7adc0c..0022cf889098 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -24,6 +24,7 @@ #include <sstream> #include <string> +#include <android/fdsan.h> #include <fcntl.h> #include <grp.h> #include <inttypes.h> @@ -793,6 +794,8 @@ static pid_t ForkCommon(JNIEnv* env, jstring java_se_name, bool is_system_server fail_fn(error_msg); } + android_fdsan_error_level fdsan_error_level = android_fdsan_get_error_level(); + pid_t pid = fork(); if (pid == 0) { @@ -809,6 +812,9 @@ static pid_t ForkCommon(JNIEnv* env, jstring java_se_name, bool is_system_server if (!gOpenFdTable->ReopenOrDetach(&error_msg)) { fail_fn(error_msg); } + + // Turn fdsan back on. + android_fdsan_set_error_level(fdsan_error_level); } // We blocked SIGCHLD prior to a fork, we unblock it here. |