Global reference leak in `Callback.bind()`
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 72/100
Línea de trabajo
Lee bundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c, centrándote en CALLBACK_NATIVE(bind) y su ruta de fail; compara esa ruta con la limpieza de CALLBACK_NATIVE(unbind). Revisa las pruebas relacionadas con callbacks o las comprobaciones de compilación nativa del repositorio y, después, verifica que un fallo al crear la segunda referencia global no deje ninguna referencia ni ningún slot parcialmente inicializado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I found a possible JNI global reference leak in Callback.bind() when native callback registration fails halfway through initialization.
File: bundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c
Function: CALLBACK_NATIVE(bind)
Relevant code:
for (i=0; i<MAX_CALLBACKS; i++) {
if (!callbackData[i].callback) {
if ((callbackData[i].callback = (*env)->NewGlobalRef(env, callbackObject)) == NULL) goto fail;
if ((callbackData[i].object = (*env)->NewGlobalRef(env, object)) == NULL) goto fail;
callbackData[i].isStatic = isStatic;
callbackData[i].isArrayBased = isArrayBased;
callbackData[i].argCount = argCount;
callbackData[i].errorResult = errorResult;
callbackData[i].methodID = mid;
result = (jlong) fnx_array[argCount][i];
break;
}
}
fail:
if (method && methodString) (*env)->ReleaseStringUTFChars(env, method, methodString);
if (signature && sigString) (*env)->ReleaseStringUTFChars(env, signature, sigString);
return result;
NewGlobalRef() returns a new global reference:
callbackData[i].callback = (*env)->NewGlobalRef(env, callbackObject)
If this first global reference succeeds but the second one fails:
callbackData[i].object = (*env)->NewGlobalRef(env, object)
the function jumps to fail. The fail block releases the UTF strings, but it does not delete the already-created callbackData[i].callback global reference and does not clear the partially initialized slot.
This leaves a global reference to the Java Callback object stored in callbackData[i].callback. Since bind() returns 0 on this path, the Java constructor reports callback allocation failure and the normal unbind() path is not reached for this partially initialized entry.
The successful cleanup path does release both global references:
if (callbackData[i].callback != NULL) (*env)->DeleteGlobalRef(env, callbackData[i].callback);
if (callbackData[i].object != NULL) (*env)->DeleteGlobalRef(env, callbackData[i].object);
memset(&callbackData[i], 0, sizeof(CALLBACK_DATA));
but that cleanup is only in CALLBACK_NATIVE(unbind), not in the partial-failure path of bind().
Suggested fix: avoid storing the global references into callbackData[i] until both have been created successfully, or explicitly roll back the first global reference and clear the slot before jumping to fail.
- Lenguaje dominante
- Java
- Estrellas
- 202
- Forks
- 206
- Merge medio
- 14 h 7 min
- PR fusionados (30 d)
- 103
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de eclipse-platform/eclipse.platform.swt
-
`SWT_AWT.initFrame` takes `(long, String)` in Java; the GTK native declares no `className` and the Cocoa native types it `const char *`Posiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
eclipse-platform/eclipse.platform.swt#3665 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
eclipse-platform/eclipse.platform.swt#3546 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 75/100
eclipse-platform/eclipse.platform.swt#3336 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
eclipse-platform/eclipse.platform.swt#3718 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
eclipse-platform/eclipse.platform.swt#3717 ·
Los mantenedores suelen responder en 1 día
Todos los issues de eclipse-platform/eclipse.platform.swt
Issues similares
-
`timer` rule rejects dates the engine acceptsPosiblemente ocupada @MFA-G la tomó hoy. Abiertobug ready
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
camunda/bpmnlint-plugin-camunda-compat#281 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
status: waiting-for-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
AOT compilation fails for derived delete queries returning SetPosiblemente ocupada @ryujungkyun la tomó hoy. Abiertostatus: waiting-for-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
spring-projects/spring-data-jpa#4387 ·
Los mantenedores suelen responder en 3 días