JNI global references leak when native method registration fails

Ouverte
#1,738 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
66/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Active
Stack technique
c, java
Domaine
backend

Piste de recherche

Commencez dans native/dispatch.c, au niveau de Java_com_sun_jna_Native_registerMethod, en particulier sur le chemin de nettoyage atteint après l’échec de ffi_prep_cif, ffi_closure_alloc ou ffi_prep_closure_loc. Suivez la propriété de closure_method, from_native, to_native, closure_arg_types, encoding et de la FFI closure, puis vérifiez que les enregistrements échoués les libèrent, tandis que les enregistrements réussis continuent de transférer le nettoyage à Native_unregister.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Summary

Java_com_sun_jna_Native_registerMethod creates persistent JNI references before several fallible FFI initialization steps.

Affected code:
https://github.com/java-native-access/jna/blob/d036ad9781adad4b66693e8fa7098e4ac665e0a3/native/dispatch.c#L3553-L3587

If ffi_prep_cif, ffi_closure_alloc, or ffi_prep_closure_loc fails, execution jumps to cleanup. That path frees data without calling DeleteGlobalRef for data->closure_method.

Because registration did not complete, Native_unregister cannot release this reference later.

Impact

Each failed registration permanently retains the reflected Java Method and potentially its class-loader object graph until JVM shutdown. Repeated failures may cause persistent memory growth.

The same cleanup path also omits some related resources, including weak global references, closure_arg_types, encoding, and an allocated FFI closure.

Suggested fix

Before freeing data on failure:

  • Delete closure_method with DeleteGlobalRef.
  • Delete any from_native and to_native weak global references.
  • Free all allocated arrays, encoding data, and FFI closure memory.

Successful registrations should continue to transfer ownership to Native_unregister.

Langage dominant
Java
Étoiles
8.9k
Forks
1.7k
Merge moyen
7 j 18 h
PR mergées (30 j)
2

Préparer son environnement

Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de java-native-access/jna

Toutes les issues de java-native-access/jna

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.