Merge changes from topic "bionic_fdsan_java"
* changes: ParcelFileDescriptor: support bionic's fd ownership tracking. Reenable fdsan in the zygote post-fork.
This commit is contained in:
@ -37,7 +37,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;
|
||||
@ -2136,19 +2135,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().
|
||||
*/
|
||||
|
@ -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();
|
||||
|
@ -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},
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include <android/fdsan.h>
|
||||
#include <fcntl.h>
|
||||
#include <grp.h>
|
||||
#include <inttypes.h>
|
||||
@ -789,6 +790,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) {
|
||||
@ -805,6 +808,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.
|
||||
|
Reference in New Issue
Block a user