[gnutls-help] Bug#964284: guile-gnutls: update to use guile 3.0

Daiki Ueno ueno at gnu.org
Wed Dec 30 14:57:33 CET 2020


Hello Ludo,

Ludovic Courtès <ludo at gnu.org> 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



More information about the Gnutls-help mailing list