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

Commit babe8154 authored by Sharvil Nanavati's avatar Sharvil Nanavati
Browse files

DO NOT MERGE Add 'bluetooth' user to the 'system' group.

Also grant the Bluetooth process CAP_BLOCK_SUSPEND so it can acquire
wake locks directly from /sys/power/wake_lock.

Bug: 23375670
Change-Id: Ib094c5752d49488c2560897ff6bb821daf98a281
parent 3bd58233
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -601,10 +601,34 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
        jint debug_flags, jobjectArray rlimits,
        jint mount_external, jstring se_info, jstring se_name,
        jintArray fdsToClose, jstring instructionSet, jstring appDataDir) {
    // Grant CAP_WAKE_ALARM to the Bluetooth process.
    jlong capabilities = 0;
    if (uid == AID_BLUETOOTH) {
        // Grant CAP_WAKE_ALARM and CAP_BLOCK_SUSPEND to the Bluetooth process.
        capabilities |= (1LL << CAP_WAKE_ALARM);
        capabilities |= (1LL << CAP_BLOCK_SUSPEND);

        // Add the Bluetooth process to the system group.
        jsize length = env->GetArrayLength(reinterpret_cast<jarray>(gids));
        jintArray gids_with_system = env->NewIntArray(length + 1);
        if (!gids_with_system) {
            ALOGE("could not allocate java array for gids");
            RuntimeAbort(env);
        }

        jint *gids_elements = env->GetIntArrayElements(gids, NULL);
        jint *gids_with_system_elements = env->GetIntArrayElements(gids_with_system, NULL);

        if (!gids_elements || !gids_with_system_elements) {
            ALOGE("could not allocate arrays for gids");
            RuntimeAbort(env);
        }

        gids_with_system_elements[0] = AID_SYSTEM;
        memcpy(&gids_with_system_elements[1], &gids_elements[0], length * sizeof(jint));

        env->ReleaseIntArrayElements(gids, gids_elements, JNI_ABORT);
        env->ReleaseIntArrayElements(gids_with_system, gids_with_system_elements, 0);
        gids = gids_with_system;
    }

    return ForkAndSpecializeCommon(env, uid, gid, gids, debug_flags,