Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Global reference leak in `Callback.bind()`

Abierto Apto para principiantes
#3,428 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Tranquilo
Stack tecnológico
java
Área
backend

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

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de eclipse-platform/eclipse.platform.swt

Todos los issues de eclipse-platform/eclipse.platform.swt

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.