Hello Ludo, Ludovic Courtès <[email protected]> writes:
> This is because Guile >= 3.0.1 and >= 2.2.7 changes the GMP allocation > functions such that they go through libgc¹. As a result, libgc may > reuse that memory when it becomes unreachable from its point of view; in > this case, since GnuTLS structures are not scanned by libgc, libgc > doesn’t “see” pointers to those bignums and thus considers they are no > longer reachable. That's interesting, though I might not follow completely. > • In Guile-GnuTLS, arrange so that GnuTLS allocations are made through > libgc. Unfortunately, ‘gnutls_global_set_mem_functions’ was > deprecated in GnuTLS 3.3.0 so this doesn’t look like an option. GnuTLS doesn't call mp_set_memory_functions, so even if it is possible, I doubt that it would affect the current behavior. On the other hand, if GnuTLS (or Nettle) internally allocates an mpz_t, it should be done using the libgc-backed allocator set by Guile and the pointers should be reachable until it is no longer, if I understand correctly. Therefore, I suspect that there might be some code that confuses libgc to track the pointers; one thing that comes to my mind is a manual copy of mpz_t values: https://gitlab.com/gnutls/gnutls/-/blob/master/lib/nettle/pk.c#L141 If you replace memcpy with mpz_init_set, does it work? Regards, -- Daiki Ueno _______________________________________________ Gnutls-help mailing list [email protected] http://lists.gnupg.org/mailman/listinfo/gnutls-help
