From 52eac5b2f32e368b5a14cd63609713419c7392db Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Tue, 1 Feb 2022 15:36:59 +0100 Subject: [PATCH 1/5] 8276990: Memory leak in invoker.c fillInvokeRequest() during JDI operations --- src/jdk.jdwp.agent/share/native/libjdwp/invoker.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c index 42e6741d467c5..a7635a07792b5 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c +++ b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c @@ -232,6 +232,10 @@ fillInvokeRequest(JNIEnv *env, InvokeRequest *request, /* * Squirrel away the method signature */ + char* oldSignature = request->methodSignature; + if (oldSignature != NULL) { + jvmtiDeallocate(oldSignature); + } error = methodSignature(method, NULL, &request->methodSignature, NULL); if (error != JVMTI_ERROR_NONE) { return error; From 4b62941baff068d23827da4900791d62c80ed49a Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Wed, 2 Feb 2022 14:02:56 +0100 Subject: [PATCH 2/5] Deallocate methodSignature after completed request --- src/jdk.jdwp.agent/share/native/libjdwp/invoker.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c index a7635a07792b5..445a3601c01f4 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c +++ b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c @@ -232,10 +232,7 @@ fillInvokeRequest(JNIEnv *env, InvokeRequest *request, /* * Squirrel away the method signature */ - char* oldSignature = request->methodSignature; - if (oldSignature != NULL) { - jvmtiDeallocate(oldSignature); - } + JDI_ASSERT_MSG(request->methodSignature == NULL, "Request methodSignature not null"); error = methodSignature(method, NULL, &request->methodSignature, NULL); if (error != JVMTI_ERROR_NONE) { return error; @@ -767,6 +764,10 @@ invoker_completeInvokeRequest(jthread thread) isReferenceTag(returnType); } + JDI_ASSERT_MSG(request->methodSignature != NULL, "methodSignature must be != NULL"); + jvmtiDeallocate(request->methodSignature); + request->methodSignature = NULL; + /* * At this time, there's no need to retain global references on * arguments since the reply is processed. No one will deal with From a273574ba9e8f64eaa6bdb1eccf66f9c091716a8 Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Wed, 2 Feb 2022 15:10:09 +0100 Subject: [PATCH 3/5] Deallocate methodSignature in deleteGlobalArgumentRefs() --- src/jdk.jdwp.agent/share/native/libjdwp/invoker.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c index 445a3601c01f4..f183d8c10a223 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c +++ b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c @@ -173,7 +173,6 @@ deleteGlobalArgumentRefs(JNIEnv *env, InvokeRequest *request) jint argIndex = 0; jbyte argumentTag = 0; jvalue *argument = request->arguments; - methodSignature_init(request->methodSignature, &cursor); if (request->clazz != NULL) { tossGlobalRef(env, &(request->clazz)); @@ -192,6 +191,10 @@ deleteGlobalArgumentRefs(JNIEnv *env, InvokeRequest *request) argument++; argIndex++; } + + JDI_ASSERT_MSG(request->methodSignature != NULL, "methodSignature is NULL"); + jvmtiDeallocate(request->methodSignature); + request->methodSignature = NULL; } static jvmtiError @@ -764,10 +767,6 @@ invoker_completeInvokeRequest(jthread thread) isReferenceTag(returnType); } - JDI_ASSERT_MSG(request->methodSignature != NULL, "methodSignature must be != NULL"); - jvmtiDeallocate(request->methodSignature); - request->methodSignature = NULL; - /* * At this time, there's no need to retain global references on * arguments since the reply is processed. No one will deal with From 812ad324e80343861dd978b0ef3c0e65c76e8a02 Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Wed, 2 Feb 2022 18:00:50 +0100 Subject: [PATCH 4/5] Preserve methodSignature_init(), we need the cursor later --- src/jdk.jdwp.agent/share/native/libjdwp/invoker.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c index f183d8c10a223..c5b619803cca4 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c +++ b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c @@ -173,6 +173,7 @@ deleteGlobalArgumentRefs(JNIEnv *env, InvokeRequest *request) jint argIndex = 0; jbyte argumentTag = 0; jvalue *argument = request->arguments; + methodSignature_init(request->methodSignature, &cursor); if (request->clazz != NULL) { tossGlobalRef(env, &(request->clazz)); From b3e7a52982a9aa0e0db9f389c378091af48159ff Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Wed, 2 Feb 2022 20:30:11 +0100 Subject: [PATCH 5/5] Move freeing of methodSignature after deleteGlobalArgumentRefs() --- src/jdk.jdwp.agent/share/native/libjdwp/invoker.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c index c5b619803cca4..2f6eb5f40a1ac 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c +++ b/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c @@ -192,10 +192,6 @@ deleteGlobalArgumentRefs(JNIEnv *env, InvokeRequest *request) argument++; argIndex++; } - - JDI_ASSERT_MSG(request->methodSignature != NULL, "methodSignature is NULL"); - jvmtiDeallocate(request->methodSignature); - request->methodSignature = NULL; } static jvmtiError @@ -780,6 +776,10 @@ invoker_completeInvokeRequest(jthread thread) */ deleteGlobalArgumentRefs(env, request); + JDI_ASSERT_MSG(request->methodSignature != NULL, "methodSignature is NULL"); + jvmtiDeallocate(request->methodSignature); + request->methodSignature = NULL; + /* From now on, do not access the request structure anymore * for this request id, because once we give up the invokerLock it may * be immediately reused by a new invoke request.