summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2012-09-24 17:29:21 +0200
committerMichael Stahl <mstahl@redhat.com>2012-09-24 17:51:41 +0200
commitd68113f3229d0ec8c84f77dcac3b64a3fd7e03e4 (patch)
tree0a21e828b909223e96a689d278420792c307b678
parente5d64a0c5c5a49c55f51a1fcfed18bbb0436cc56 (diff)
soffice.bin: add a hack to detect calls to xmlCleanupParser
xmlCleanupParser frees libxml2's global variables, accessing those later on leads to hard to debug crashes. Because libxml2 is used indirectly by lots of different components, nobody is allwed to free its globals. Change-Id: I05381d3dada217db44e96445d6f6d63014f57241
-rw-r--r--desktop/source/app/main.c14
-rw-r--r--unoxml/source/rdf/librdf_repository.cxx6
2 files changed, 20 insertions, 0 deletions
diff --git a/desktop/source/app/main.c b/desktop/source/app/main.c
index ae016b498297..c18fabd158d2 100644
--- a/desktop/source/app/main.c
+++ b/desktop/source/app/main.c
@@ -25,4 +25,18 @@ SAL_IMPLEMENT_MAIN() {
return soffice_main();
}
+#ifdef DBG_UTIL
+#ifdef __gnu_linux__
+#include <stdio.h>
+#include <stdlib.h>
+
+/* HACK: detect calls to xmlCleanupParser, which causes hard to debug crashes */
+__attribute__ ((visibility("default"))) void xmlCleanupParser(void)
+{
+ fprintf(stderr, "\n*** ERROR: DO NOT call xmlCleanupParser()\n\n");
+ abort();
+}
+#endif
+#endif
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/unoxml/source/rdf/librdf_repository.cxx b/unoxml/source/rdf/librdf_repository.cxx
index 733b3132e0c4..1e98ee5a6fcf 100644
--- a/unoxml/source/rdf/librdf_repository.cxx
+++ b/unoxml/source/rdf/librdf_repository.cxx
@@ -127,7 +127,13 @@ bool isInternalContext(librdf_node *i_pNode) throw ()
// so they need to be wrapped to be usable with boost::shared_ptr.
static void safe_librdf_free_world(librdf_world *const world)
{
+#if 1
+ (void)world; // leak it
+#else
+ // disable this for now: it calls xmlCleanupParser, which now aborts
+ // (see desktop/source/app/main.c)
if (world) { librdf_free_world(world); }
+#endif
}
static void safe_librdf_free_model(librdf_model *const model)
{