Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba529186 authored by Josh Gao's avatar Josh Gao Committed by android-build-merger
Browse files

Merge changes from topic "bionic_fdsan_java" am: bb352287 am: 1fad55e8 am: f2871399

am: c671d623

Change-Id: I23613868a74b7b1dbd09a3325578c06b391780b5
parents 1e879d24 c671d623
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -39,7 +39,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;
@@ -2100,19 +2099,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().
     */
+7 −2
Original line number Diff line number Diff line
@@ -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();
+0 −88
Original line number Diff line number Diff line
@@ -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},
+6 −0
Original line number Diff line number Diff line
@@ -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.