View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000132 | LDMud 3.3 | Compilation, Installation | public | 2004-09-27 23:18 | 2005-05-15 13:04 |
Reporter | peng | Assigned To | |||
Priority | normal | Severity | crash | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Fixed in Version | 3.3 | ||||
Summary | 0000132: gnutls + MALLOC_TRACE impossible | ||||
Description | I've tried to do both (using smalloc and addional MALLOC_TRACE_LPC) and it crashes at initialization of the gnutls-libary. I've lost the core, but there was a statement about freeing memory without some magic word or so.. It seems allocation inside the gnutls-libary is not compatible with MALLOC_TRACE | ||||
Tags | No tags attached. | ||||
Attached Files | backtrace_malloc_trace_gnutls.txt (1,884 bytes)
#0 UNLINK_SMALL_FREE (block=0xffffffff) at smalloc.c:1055 1055 const word_t bsize = block[M_SIZE] & M_MASK; (gdb) bt #0 UNLINK_SMALL_FREE (block=0xffffffff) at smalloc.c:1055 #1 0x080f5081 in mem_alloc (size=96) at smalloc.c:1527 #2 0x080f6a58 in xalloc_traced (size=86, malloc_trace_file=0x81193f3 "strfuns.c", malloc_trace_line=123) at xalloc.c:516 #3 0x080e9f01 in strbuf_grow (buf=0xbfffe200, len=22) at strfuns.c:123 #4 0x080e8bac in strbuf_add (buf=0xbfffe200, text=0xbfffd150 "No program to trace.\n") at strfuns.c:152 #5 0x080e8cc1 in strbuf_addf (buf=0x18, format=0x18 <Address 0x18 out of bounds>) at strfuns.c:226 #6 0x0809886b in collect_trace (sbuf=0xbfffe200, rvec=0x0) at interpret.c:18142 #7 0x0809893c in dump_trace (how=1, rvec=0x18) at interpret.c:18435 #8 0x080dfd44 in fatal (fmt=0x811b02c "mem_free: block %p magic match failed: size %lu, expected %lx, found %lx\n") at simulate.c:621 #9 0x080f5275 in sfree (ptr=0xffffffff) at smalloc.c:1821 #10 0x080f52ac in mem_free (ptr=0x829fd18) at smalloc.c:1854 #11 0x080f768f in free (ptr=0x829fd2c) at xalloc.c:1226 #12 0x402658c4 in gcry_free () from /usr/lib/libgcrypt.so.11 #13 0x0829fd2c in ?? () #14 0x402b856c in ?? () from /usr/lib/libgcrypt.so.11 #15 0x0829f7d0 in ?? () #16 0x402a0913 in gcry_mpi_sub () from /usr/lib/libgcrypt.so.11 #17 0x4cd72d6d in ?? () #18 0x0829fdb8 in ?? () #19 0x0829f7d0 in ?? () #20 0x402a0b8d in gcry_mpi_test_bit () from /usr/lib/libgcrypt.so.11 #21 0x402a6edf in gcry_mpi_aprint () from /usr/lib/libgcrypt.so.11 #22 0x00000011 in ?? () #23 0x0829fe74 in ?? () #24 0x0829ff00 in ?? () #25 0x4cd72d6d in ?? () #26 0x4000a670 in _dl_rtld_di_serinfo () from /lib/ld-linux.so.2 #27 0x402a24bc in gcry_mpi_gcd () from /usr/lib/libgcrypt.so.11 #28 0x00000080 in ?? () #29 0x0829ff30 in ?? () #30 0x00000001 in ?? () #31 0x00000001 in ?? () #32 0x0829fbe4 in ?? () tls_malloc_trace.diff (2,095 bytes)
Index: pkg-tls.c =================================================================== --- pkg-tls.c (Revision 149) +++ pkg-tls.c (Arbeitskopie) @@ -189,6 +189,46 @@ gnutls_dh_set_prime_bits( *session, DH_BITS); } /* initialize_tls_session() */ +/*-------------------------------------------------------------------------*/ +static void * +tls_xalloc (size_t size) + +/* Wrapper function so that (gnu)tls will use our special allocator. + * Must use this construct since direct using is impossible due to + * the defines in xalloc.h. + */ +{ + return xalloc(size); +} /* tls_xalloc() */ + +/*-------------------------------------------------------------------------*/ +static void * +tls_rexalloc (void *old, size_t size) + +/* Wrapper function so that (gnu)tls will use our special allocator. + * It also takes care of the special behaviour of gnutls (realloc + * with NULL-pointer instead of using malloc. + */ +{ + if (old == NULL) + return xalloc(size); + return rexalloc(old, size); +} /* tls_rexalloc() */ + +/*-------------------------------------------------------------------------*/ +static void +tls_xfree (void *p) + +/* Wrapper function so that (gnu)tls will use our special allocator. + * It also takes care of the special behaviour of gnutls (freeing + * NULL-pointers + */ +{ + if (p == NULL) + return; + return xfree(p); +} /* tls_free() */ + #endif /* SSL Package */ /*-------------------------------------------------------------------------*/ @@ -341,6 +381,15 @@ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); #endif + /* Use a special allocator since its impossible to do a sbrk_trace with + * the default one. + */ + gnutls_global_set_mem_functions(tls_xalloc, + tls_xalloc, + NULL, + tls_rexalloc, + tls_xfree); + gnutls_global_init(); gnutls_certificate_allocate_credentials(&x509_cred); | ||||
|
A core file would be very helpful as I can't reproduce the problem on my machine. |
|
This is the backtrace, but I supose its not that useful. I've no idea about enabling full symbols in the gnutls and gcrypt-libaries. It crashes at f = gnutls_certificate_set_x509_key_file(x509_cred, certfile, keyfile, GNUTLS_X509_FMT_PEM); the gnutls_global_init works fine. Versions: 3.3.605, gnutls-1.0.17, libgcrypt-1.1.94 |
|
Ok, I've found a solution. Crash is because some strange behaviour of the gnutls-lib: It tries to free Null-Pointers and it tries to reallocate NULL-Pointers instead of allocating new memory. Patch applied (wrapper functions for the custom allocator-funtions that take care of this. |
|
Fixed in 3.3.627, with a slight modification: I modified the central xfree() and rexalloc() functions to accept NULL pointers and do the right thing with them, in order to bring them in line with the C standard. But I also kept the wrapper in gnutls to keep the ability to tag gnutls' allocations properly. |
Date Modified | Username | Field | Change |
---|---|---|---|
2004-09-27 23:18 | peng | New Issue | |
2004-09-29 22:55 |
|
Note Added: 0000192 | |
2004-10-02 04:36 | peng | File Added: backtrace_malloc_trace_gnutls.txt | |
2004-10-02 04:40 | peng | Note Added: 0000195 | |
2004-10-02 04:42 | peng | File Added: core-gnutls_malloc_trace.gz | |
2004-12-05 04:53 | peng | Note Added: 0000234 | |
2004-12-05 04:54 | peng | File Added: tls_malloc_trace.diff | |
2004-12-07 23:23 |
|
Status | new => resolved |
2004-12-07 23:23 |
|
Fixed in Version | => 3.3 |
2004-12-07 23:23 |
|
Resolution | open => fixed |
2004-12-07 23:23 |
|
Assigned To | => lars |
2004-12-07 23:23 |
|
Note Added: 0000241 | |
2004-12-07 23:23 |
|
Assigned To | lars => |
2005-05-15 13:04 |
|
Status | resolved => closed |