After I upgraded to jessie I ran into this problem as well. Then I found
out that this problem has been known about for over a year and noone had
done anything about it (<insert lots of swearing here>).

So I spent a good chunk of last Sunday installing debug symybol packages
and even rebuilding MySQL with debug symbols enabled (since there are no
symbol packages available) so I could follow the problem all the way
through the code.

As already indicated by the stacktrace in the original bug report,

> #2  0x00007fa1fe20877b in my_malloc () from
/usr/lib/x86_64-linux-gnu/libsres.so.14
> #3  0x00007fa1fc04863a in my_error_register () from /usackage
libval14) r/lib/x86_64-linux-gnu/libmysqlclient.so.18

the problem is with libsres (package libval14) or rather the combination
of libmysqlclient and libsres.

Both libraries have a non-local function named my_malloc() - with
different argument lists.

Current irssi builds are linked against libsres and it seems that when a
perl script executed by libperl loads libmysqlclient thru the use of
DBD-MySQL the symbol my_malloc is somehow resolved to the one from
libsres instead the (more local) one in libmysqlclient.

Since the functions my_malloc, my_free and my_strdup from libsres *seem*
to be used only by libval, I renamed them (and all references to them in
libval) to libsres_malloc, libsres_free and libsres_strdup respectively.
Then I rebuilt and reinstalled the packages. And tataa.. problem solved
- at least for me.

I've attached my patch file, but unless I'm completely wrong in my
analysis, this should probably be solved upstream.

-- 
Description: Fix for symbol clash with libmysqlclient 
 Change names of support functions my_malloc(), my_free(), my_strdup()
 to libsres_malloc(), libsres_free(), libsres_strdup() to work around problems
 when also linking against libmysqlclient - or dynamically loading libmysqlclient
 at runtime (for example when using a perl script with Irssi that in turn
 uses DBD-MySQL to access database - see Debian bug #764551).
Author: Steffen Kern <[email protected]>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- dnsval-2.0.orig/include/validator/validator-compat.h
+++ dnsval-2.0/include/validator/validator-compat.h
@@ -1012,9 +1012,9 @@ struct addrinfo {
 
 
 #ifdef MEMORY_DEBUGGING
-#define MALLOC(s) my_malloc(s, __FILE__, __LINE__)
-#define FREE(p) my_free(p,__FILE__,__LINE__)
-#define STRDUP(p) my_strdup(p,__FILE__,__LINE__)
+#define MALLOC(s) libsres_malloc(s, __FILE__, __LINE__)
+#define FREE(p) libsres_free(p,__FILE__,__LINE__)
+#define STRDUP(p) libsres_strdup(p,__FILE__,__LINE__)
 #else
 #define MALLOC(s) malloc(s)
 #define FREE(p) free(p)
--- dnsval-2.0.orig/libsres/res_support.c
+++ dnsval-2.0/libsres/res_support.c
@@ -91,7 +91,7 @@ res_gettimeofday_buf(char *buf, size_t b
 
 
 void
-my_free(void *p, char *filename, int lineno)
+libsres_free(void *p, char *filename, int lineno)
 {
     if (logfile == NULL)
         logfile = fopen(MEM_LOGFILE, "w");
@@ -103,7 +103,7 @@ my_free(void *p, char *filename, int lin
 }
 
 void           *
-my_malloc(size_t t, char *filename, int lineno)
+libsres_malloc(size_t t, char *filename, int lineno)
 {
     void           *p;
 
@@ -125,7 +125,7 @@ my_malloc(size_t t, char *filename, int
 }
 
 char           *
-my_strdup(const char *str, char *filename, int lineno)
+libsres_strdup(const char *str, char *filename, int lineno)
 {
     char           *p = strdup(str);
     if (logfile == NULL)
--- dnsval-2.0.orig/libsres/res_support.h
+++ dnsval-2.0/libsres/res_support.h
@@ -65,9 +65,9 @@
 	(cp) += NS_INT32SZ; \
 } while (0)
 
-void            my_free(void *p, char *filename, int lineno);
-void           *my_malloc(size_t t, char *filename, int lineno);
-char           *my_strdup(const char *str, char *filename, int lineno);
+void            libsres_free(void *p, char *filename, int lineno);
+void           *libsres_malloc(size_t t, char *filename, int lineno);
+char           *libsres_strdup(const char *str, char *filename, int lineno);
 
 void            print_response(u_char * ans, size_t resplen);
 void            log_response(u_char * ans, size_t resplen);
--- dnsval-2.0.orig/libval/val_support.h
+++ dnsval-2.0/libval/val_support.h
@@ -55,9 +55,9 @@
 #define IT_HASNT        1
 #define IT_WONT         (-1)
 
-void            my_free(void *p, char *filename, int lineno);
-void           *my_malloc(size_t t, char *filename, int lineno);
-char           *my_strdup(const char *str, char *filename, int lineno);
+void            libsres_free(void *p, char *filename, int lineno);
+void           *libsres_malloc(size_t t, char *filename, int lineno);
+char           *libsres_strdup(const char *str, char *filename, int lineno);
 
 u_char *      namename(u_char * big_name, u_char * little_name);
 #ifdef LIBVAL_NSEC3

Reply via email to