Good catch! Fixed.
Thanks! Aleksey
Checking in dl.c; /cvs/gnome/xmlsec/src/dl.c,v <-- dl.c new revision: 1.10; previous revision: 1.9 done
Daniel Vogelheim wrote:
Dear Aleksey,
I have encountered a problem with libxmlsec, and I believe you are the proper addressee for making sure a fix gets into the libxmlsec distribution. If not, please advise on whom else to contact.
The problem is in file src/dl.c, in one of the initialization functions. In there, pointers to allocator/deallocator methods are initialized, but only after they have in been used in code called from the initialization routine itself. The result is memory being allocated through the default memory allocator, but later on this memory is freed using the non-matching, custom deallocator.
Please find below: 1) a more detailed description of the problem, and 2) a patch for src/dl.c, for integration into libxmlsec
If you see any problems with the fix, I would appreciate some feedback on the details. Thank you very much.
Sincerely, Daniel Vogelheim
Problem description:
---------------------
Investigation revealed a problem in src/dl.c, function xmlSecCryptoDLInit(): This method calls two init functions, xmlSecPtrListInitialize(..) and xmlsec_lt_dlinit(), and at the end initializes two function pointers used for memory allocation/deallocation by libxmlsec, xmlsec_lt_dlmalloc and xmlsec_lt_dlfree. The problem is that xmlsec_lt_dlinit allocates memory using libxmlsec_lt_dlmalloc (e.g. in lt_dlloader_add(..)) *before* assigning the allocator function pointer. This results in memory being allocated using the default (system) allocator and being freed through our (non-system) allocator, which doesn't work. Moving the xmlsec_lt_dlmalloc/.._dlfree initialization to the top of the function solves the problem. Would this fix be acceptable?
--------------------
Patch file: ------------------------ [...\xmlsec1-1.2.4\src]diff -u dl.c~ dl.c --- dl.c~ Wed Oct 29 15:57:20 2003 +++ dl.c Tue Oct 26 12:12:26 2004 @@ -329,6 +329,10 @@ xmlSecCryptoDLInit(void) { int ret;
+ /* use xmlMalloc/xmlFree */
+ xmlsec_lt_dlmalloc = xmlSecCryptoDLMalloc;
+ xmlsec_lt_dlfree = xmlSecCryptoDLFree;
+
ret = xmlSecPtrListInitialize(&gXmlSecCryptoDLLibraries, xmlSecCryptoDLLibr
ariesListGetKlass());
if(ret < 0) {
xmlSecError(XMLSEC_ERRORS_HERE,
@@ -350,9 +354,6 @@
}
/* TODO: LTDL_SET_PRELOADED_SYMBOLS(); */
- /* use xmlMalloc/xmlFree */ - xmlsec_lt_dlmalloc = xmlSecCryptoDLMalloc; - xmlsec_lt_dlfree = xmlSecCryptoDLFree; return(0); } ----------------------------
_______________________________________________ xmlsec mailing list [EMAIL PROTECTED] http://www.aleksey.com/mailman/listinfo/xmlsec
