From d0e4d6d6cbb8cfec84595b0429d0d0f01cf48b13 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 30 Apr 2024 16:43:12 +0000 Subject: AdbDebuggingManager: simplify JNI, add missing error checks. Noticed while looking at https://issuetracker.google.com/338006730 though that bug seems to have been fixed already on the Java side. Change-Id: I49379da8dbfa0800944ce856c7563ab9646200d2 --- .../com_android_server_adb_AdbDebuggingManager.cpp | 78 ++++++---------------- 1 file changed, 22 insertions(+), 56 deletions(-) diff --git a/services/core/jni/com_android_server_adb_AdbDebuggingManager.cpp b/services/core/jni/com_android_server_adb_AdbDebuggingManager.cpp index 9c834aaece85..c7b6852d7177 100644 --- a/services/core/jni/com_android_server_adb_AdbDebuggingManager.cpp +++ b/services/core/jni/com_android_server_adb_AdbDebuggingManager.cpp @@ -18,58 +18,22 @@ #define LOG_NDEBUG 0 -#include #include #include #include -#include -#include -#include #include #include -#include - +#include #include -#include "jni.h" +#include +#include namespace android { // ---------------------------------------------------------------------------- namespace { -template -class JSmartWrapper { -public: - JSmartWrapper(JNIEnv* env, T* jData) : mEnv(env), mJData(jData) {} - - virtual ~JSmartWrapper() = default; - - const N* data() const { return mRawData; } - - jsize size() const { return mSize; } - -protected: - N* mRawData = nullptr; - JNIEnv* mEnv = nullptr; - T* mJData = nullptr; - jsize mSize = 0; -}; // JSmartWrapper - -class JStringUTFWrapper : public JSmartWrapper { -public: - explicit JStringUTFWrapper(JNIEnv* env, jstring* str) : JSmartWrapper(env, str) { - mRawData = env->GetStringUTFChars(*str, NULL); - mSize = env->GetStringUTFLength(*str); - } - - virtual ~JStringUTFWrapper() { - if (data()) { - mEnv->ReleaseStringUTFChars(*mJData, mRawData); - } - } -}; // JStringUTFWrapper - struct ServerDeleter { void operator()(PairingServerCtx* p) { pairing_server_destroy(p); } }; @@ -97,19 +61,19 @@ PairingServerPtr sServer; std::unique_ptr sWaiter; } // namespace -static jint native_pairing_start(JNIEnv* env, jobject thiz, jstring guid, jstring password) { +static jint native_pairing_start(JNIEnv* env, jobject thiz, jstring javaGuid, jstring javaPassword) { // Server-side only sends its GUID on success. - PeerInfo system_info = {}; - system_info.type = ADB_DEVICE_GUID; - JStringUTFWrapper guidWrapper(env, &guid); - memcpy(system_info.data, guidWrapper.data(), guidWrapper.size()); + PeerInfo system_info = { .type = ADB_DEVICE_GUID }; + + ScopedUtfChars guid = GET_UTF_OR_RETURN(env, javaGuid); + memcpy(system_info.data, guid.c_str(), guid.size()); - JStringUTFWrapper passwordWrapper(env, &password); + ScopedUtfChars password = GET_UTF_OR_RETURN(env, javaPassword); // Create the pairing server sServer = PairingServerPtr( - pairing_server_new_no_cert(reinterpret_cast(passwordWrapper.data()), - passwordWrapper.size(), &system_info, 0)); + pairing_server_new_no_cert(reinterpret_cast(password.c_str()), + password.size(), &system_info, 0)); sWaiter.reset(new PairingResultWaiter); uint16_t port = pairing_server_start(sServer.get(), sWaiter->ResultCallback, sWaiter.get()); @@ -137,11 +101,16 @@ static jboolean native_pairing_wait(JNIEnv* env, jobject thiz) { return JNI_FALSE; } - std::string peer_public_key = reinterpret_cast(sWaiter->peer_info_.data); - // Write to PairingThread's member variables + // Create a Java string for the public key. + char* peer_public_key = reinterpret_cast(sWaiter->peer_info_.data); + jstring jpublickey = env->NewStringUTF(peer_public_key); + if (jpublickey == nullptr) { + return JNI_FALSE; + } + + // Write to PairingThread.mPublicKey. jclass clazz = env->GetObjectClass(thiz); jfieldID mPublicKey = env->GetFieldID(clazz, "mPublicKey", "Ljava/lang/String;"); - jstring jpublickey = env->NewStringUTF(peer_public_key.c_str()); env->SetObjectField(thiz, mPublicKey, jpublickey); return JNI_TRUE; } @@ -157,12 +126,9 @@ static const JNINativeMethod gPairingThreadMethods[] = { }; int register_android_server_AdbDebuggingManager(JNIEnv* env) { - int res = jniRegisterNativeMethods(env, - "com/android/server/adb/AdbDebuggingManager$PairingThread", - gPairingThreadMethods, NELEM(gPairingThreadMethods)); - (void)res; // Faked use when LOG_NDEBUG. - LOG_FATAL_IF(res < 0, "Unable to register native methods."); - return 0; + return jniRegisterNativeMethods(env, + "com/android/server/adb/AdbDebuggingManager$PairingThread", + gPairingThreadMethods, NELEM(gPairingThreadMethods)); } } /* namespace android */ -- cgit v1.2.3-59-g8ed1b