Merge "Zygote: Add Arm pointer authentication keychange support."
This commit is contained in:
@@ -95,6 +95,19 @@
|
|||||||
|
|
||||||
#include "nativebridge/native_bridge.h"
|
#include "nativebridge/native_bridge.h"
|
||||||
|
|
||||||
|
/* Functions in the callchain during the fork shall not be protected with
|
||||||
|
Armv8.3-A Pointer Authentication, otherwise child will not be able to return. */
|
||||||
|
#ifdef __ARM_FEATURE_PAC_DEFAULT
|
||||||
|
#ifdef __ARM_FEATURE_BTI_DEFAULT
|
||||||
|
#define NO_PAC_FUNC __attribute__((target("branch-protection=bti")))
|
||||||
|
#else
|
||||||
|
#define NO_PAC_FUNC __attribute__((target("branch-protection=none")))
|
||||||
|
#endif /* __ARM_FEATURE_BTI_DEFAULT */
|
||||||
|
#else /* !__ARM_FEATURE_PAC_DEFAULT */
|
||||||
|
#define NO_PAC_FUNC
|
||||||
|
#endif /* __ARM_FEATURE_PAC_DEFAULT */
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// TODO (chriswailes): Add a function to initialize native Zygote data.
|
// TODO (chriswailes): Add a function to initialize native Zygote data.
|
||||||
@@ -985,7 +998,23 @@ static void ClearUsapTable() {
|
|||||||
gUsapPoolCount = 0;
|
gUsapPoolCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NO_PAC_FUNC
|
||||||
|
static void PAuthKeyChange(JNIEnv* env) {
|
||||||
|
#ifdef __aarch64__
|
||||||
|
unsigned long int hwcaps = getauxval(AT_HWCAP);
|
||||||
|
if (hwcaps & HWCAP_PACA) {
|
||||||
|
const unsigned long key_mask = PR_PAC_APIAKEY | PR_PAC_APIBKEY |
|
||||||
|
PR_PAC_APDAKEY | PR_PAC_APDBKEY | PR_PAC_APGAKEY;
|
||||||
|
if (prctl(PR_PAC_RESET_KEYS, key_mask, 0, 0, 0) != 0) {
|
||||||
|
ALOGE("Failed to change the PAC keys: %s", strerror(errno));
|
||||||
|
RuntimeAbort(env, __LINE__, "PAC key change failed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Utility routine to fork a process from the zygote.
|
// Utility routine to fork a process from the zygote.
|
||||||
|
NO_PAC_FUNC
|
||||||
static pid_t ForkCommon(JNIEnv* env, bool is_system_server,
|
static pid_t ForkCommon(JNIEnv* env, bool is_system_server,
|
||||||
const std::vector<int>& fds_to_close,
|
const std::vector<int>& fds_to_close,
|
||||||
const std::vector<int>& fds_to_ignore,
|
const std::vector<int>& fds_to_ignore,
|
||||||
@@ -1036,6 +1065,7 @@ static pid_t ForkCommon(JNIEnv* env, bool is_system_server,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The child process.
|
// The child process.
|
||||||
|
PAuthKeyChange(env);
|
||||||
PreApplicationInit();
|
PreApplicationInit();
|
||||||
|
|
||||||
// Clean up any descriptors which must be closed immediately
|
// Clean up any descriptors which must be closed immediately
|
||||||
@@ -1486,6 +1516,7 @@ static void com_android_internal_os_Zygote_nativePreApplicationInit(JNIEnv*, jcl
|
|||||||
PreApplicationInit();
|
PreApplicationInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NO_PAC_FUNC
|
||||||
static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
|
static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
|
||||||
JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
|
JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
|
||||||
jint runtime_flags, jobjectArray rlimits,
|
jint runtime_flags, jobjectArray rlimits,
|
||||||
@@ -1533,6 +1564,7 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
|
|||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NO_PAC_FUNC
|
||||||
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
|
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
|
||||||
JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
|
JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
|
||||||
jint runtime_flags, jobjectArray rlimits, jlong permitted_capabilities,
|
jint runtime_flags, jobjectArray rlimits, jlong permitted_capabilities,
|
||||||
@@ -1600,6 +1632,7 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer(
|
|||||||
* @param is_priority_fork Controls the nice level assigned to the newly created process
|
* @param is_priority_fork Controls the nice level assigned to the newly created process
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
NO_PAC_FUNC
|
||||||
static jint com_android_internal_os_Zygote_nativeForkUsap(JNIEnv* env,
|
static jint com_android_internal_os_Zygote_nativeForkUsap(JNIEnv* env,
|
||||||
jclass,
|
jclass,
|
||||||
jint read_pipe_fd,
|
jint read_pipe_fd,
|
||||||
|
|||||||
Reference in New Issue
Block a user