From 2a5f68c812fb7c9f348ee0191154a7b2f63ab7bd Mon Sep 17 00:00:00 2001 From: Geert Janssens Date: Fri, 13 Dec 2013 20:22:01 +0000 Subject: [PATCH] Bug 719481 - GnuCash report crashes with Guile2 This is actually a bug in swig. This commit works around it by patching the swig generated source files until swig itself has been fixed. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@23557 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/app-utils/Makefile.am | 5 ++- src/core-utils/Makefile.am | 5 ++- src/engine/Makefile.am | 5 ++- src/gnc-module/Makefile.am | 5 ++- src/gnc-module/test/mod-bar/Makefile.am | 5 ++- src/gnc-module/test/mod-baz/Makefile.am | 5 ++- src/gnc-module/test/mod-foo/Makefile.am | 5 ++- src/gnome-utils/Makefile.am | 5 ++- src/gnome/Makefile.am | 5 ++- src/guile-mappings.h | 2 + src/html/Makefile.am | 5 ++- src/report/report-gnome/Makefile.am | 5 ++- src/report/report-system/Makefile.am | 5 ++- src/swig-utf8.patch | 60 +++++++++++++++++++++++++ src/test-core/Makefile.am | 5 ++- 15 files changed, 114 insertions(+), 13 deletions(-) create mode 100644 src/swig-utf8.patch diff --git a/src/app-utils/Makefile.am b/src/app-utils/Makefile.am index 4043655e2b..6805da47fd 100644 --- a/src/app-utils/Makefile.am +++ b/src/app-utils/Makefile.am @@ -108,7 +108,10 @@ libgncmod_app_utils_la_LIBADD = \ if BUILDING_FROM_SCM swig-app-utils-guile.c: app-utils.i ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi swig-app-utils-python.c: app-utils.i ${top_srcdir}/src/base-typemaps.i $(SWIG) -python -Wall -Werror $(SWIG_ARGS) \ -I${top_srcdir}/src -o $@ $< diff --git a/src/core-utils/Makefile.am b/src/core-utils/Makefile.am index 6fe1c5e321..853d838d1a 100644 --- a/src/core-utils/Makefile.am +++ b/src/core-utils/Makefile.am @@ -45,7 +45,10 @@ noinst_HEADERS = \ if BUILDING_FROM_SCM swig-core-utils-guile.c: core-utils.i ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi swig-core-utils-python.c: core-utils.i ${top_srcdir}/src/base-typemaps.i $(SWIG) -python -Wall -Werror $(SWIG_ARGS) \ -I${top_srcdir}/src -o $@ $< diff --git a/src/engine/Makefile.am b/src/engine/Makefile.am index 42b5e9babd..c8afadedbc 100644 --- a/src/engine/Makefile.am +++ b/src/engine/Makefile.am @@ -204,7 +204,10 @@ swig-engine.c: engine.i $(top_srcdir)/src/base-typemaps.i \ $(QOFHEADERS) \ $(gncinclude_HEADERS) $(noinst_HEADERS) $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src/libqof/qof -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src/libqof/qof -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif iso-4217-currencies.c: iso-4217-currencies.scm iso-currencies-to-c diff --git a/src/gnc-module/Makefile.am b/src/gnc-module/Makefile.am index f48c7312c4..8227086e60 100644 --- a/src/gnc-module/Makefile.am +++ b/src/gnc-module/Makefile.am @@ -32,7 +32,10 @@ noinst_DATA = .scm-links if BUILDING_FROM_SCM swig-gnc-module.c: gnc-module.i ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif EXTRA_DIST = \ diff --git a/src/gnc-module/test/mod-bar/Makefile.am b/src/gnc-module/test/mod-bar/Makefile.am index 9443ff5e84..4ca78dd39d 100644 --- a/src/gnc-module/test/mod-bar/Makefile.am +++ b/src/gnc-module/test/mod-bar/Makefile.am @@ -24,7 +24,10 @@ libgncmodbar_la_LIBADD=libbar.la \ if BUILDING_FROM_SCM swig-bar.c: bar.i - $(SWIG) -guile $(SWIG_ARGS) -Linkage module -o $@ $< + $(SWIG) -guile $(SWIG_ARGS) -Linkage module -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif EXTRA_DIST = \ diff --git a/src/gnc-module/test/mod-baz/Makefile.am b/src/gnc-module/test/mod-baz/Makefile.am index 63d00f220f..26794f9cc9 100644 --- a/src/gnc-module/test/mod-baz/Makefile.am +++ b/src/gnc-module/test/mod-baz/Makefile.am @@ -28,7 +28,10 @@ libgncmodbaz_la_LIBADD = \ if BUILDING_FROM_SCM swig-baz.c: baz.i - $(SWIG) -guile $(SWIG_ARGS) -Linkage module -o $@ $< + $(SWIG) -guile $(SWIG_ARGS) -Linkage module -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif EXTRA_DIST = \ diff --git a/src/gnc-module/test/mod-foo/Makefile.am b/src/gnc-module/test/mod-foo/Makefile.am index f1818b8fe4..2c07e926b8 100644 --- a/src/gnc-module/test/mod-foo/Makefile.am +++ b/src/gnc-module/test/mod-foo/Makefile.am @@ -29,7 +29,10 @@ EXTRA_DIST = \ if BUILDING_FROM_SCM swig-foo.c: foo.i - $(SWIG) -guile $(SWIG_ARGS) -Linkage module -o $@ $< + $(SWIG) -guile $(SWIG_ARGS) -Linkage module -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif BUILT_SOURCES = swig-foo.c diff --git a/src/gnome-utils/Makefile.am b/src/gnome-utils/Makefile.am index e7e4bc064b..5943cc1fa1 100644 --- a/src/gnome-utils/Makefile.am +++ b/src/gnome-utils/Makefile.am @@ -227,7 +227,10 @@ if BUILDING_FROM_SCM swig-gnome-utils.c: gnome-utils.i \ ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif gncmoddir = ${GNC_SHAREDIR}/guile-modules/gnucash diff --git a/src/gnome/Makefile.am b/src/gnome/Makefile.am index e1b413b9e7..c77994fc17 100644 --- a/src/gnome/Makefile.am +++ b/src/gnome/Makefile.am @@ -114,7 +114,10 @@ noinst_HEADERS = \ if BUILDING_FROM_SCM swig-gnome.c: gnome.i dialog-progress.h ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif EXTRA_DIST = \ diff --git a/src/guile-mappings.h b/src/guile-mappings.h index 4cb4c78b30..9ec30b9829 100644 --- a/src/guile-mappings.h +++ b/src/guile-mappings.h @@ -22,6 +22,8 @@ /* Give Guile 1.8 a 2.0-like interface */ #if (SCM_MAJOR_VERSION < 2) # define scm_c_string_length scm_i_string_length +#endif +#ifndef scm_from_utf8_string # define scm_from_utf8_string scm_from_locale_string # define scm_to_utf8_string scm_to_locale_string #endif diff --git a/src/html/Makefile.am b/src/html/Makefile.am index 90699b26db..c0f47c916d 100644 --- a/src/html/Makefile.am +++ b/src/html/Makefile.am @@ -58,7 +58,10 @@ if BUILDING_FROM_SCM swig-gnc-html.c: gnc-html.i gnc-html.h \ ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif EXTRA_DIST = \ diff --git a/src/report/report-gnome/Makefile.am b/src/report/report-gnome/Makefile.am index fa6f422f43..5dbd283d31 100644 --- a/src/report/report-gnome/Makefile.am +++ b/src/report/report-gnome/Makefile.am @@ -52,7 +52,10 @@ libgncmod_report_gnome_la_LIBADD = \ if BUILDING_FROM_SCM swig-report-gnome.c: report-gnome.i ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif gncmoddir = ${GNC_SHAREDIR}/guile-modules/gnucash/report diff --git a/src/report/report-system/Makefile.am b/src/report/report-system/Makefile.am index 1dac863387..6ed2d12fb1 100644 --- a/src/report/report-system/Makefile.am +++ b/src/report/report-system/Makefile.am @@ -24,7 +24,10 @@ libgncmod_report_system_la_LIBADD = \ if BUILDING_FROM_SCM swig-report-system.c: report-system.i ${top_srcdir}/src/base-typemaps.i $(SWIG) -guile $(SWIG_ARGS) -Linkage module \ - -I${top_srcdir}/src -o $@ $< + -I${top_srcdir}/src -o $@ $<; \ + if ! `grep "define scm_from_utf8_string" $@ > /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi endif AM_CPPFLAGS = \ diff --git a/src/swig-utf8.patch b/src/swig-utf8.patch new file mode 100644 index 0000000000..86a222a991 --- /dev/null +++ b/src/swig-utf8.patch @@ -0,0 +1,60 @@ +--- guile_scm_run.swg ++++ guile_scm_run.swg +@@ -41,10 +41,14 @@ typedef struct swig_guile_clientdata { + SCM goops_class; + } swig_guile_clientdata; + ++#if SCM_MAJOR_VERSION <= 2 ++#define scm_to_utf8_string scm_to_locale_string ++#define scm_from_utf8_string scm_from_locale_string ++#endif + #define SWIG_scm2str(s) \ + SWIG_Guile_scm2newstr(s, NULL) + #define SWIG_str02scm(str) \ +- str ? scm_from_locale_string(str) : SCM_BOOL_F ++ str ? scm_from_utf8_string(str) : SCM_BOOL_F + # define SWIG_malloc(size) \ + scm_malloc(size) + # define SWIG_free(mem) \ +@@ -84,21 +88,13 @@ SWIGINTERN char * + SWIG_Guile_scm2newstr(SCM str, size_t *len) { + #define FUNC_NAME "SWIG_Guile_scm2newstr" + char *ret; +- char *tmp; +- size_t l; + + SCM_ASSERT (scm_is_string(str), str, 1, FUNC_NAME); +- l = scm_c_string_length(str); + +- ret = (char *) SWIG_malloc( (l + 1) * sizeof(char)); ++ ret = scm_to_utf8_string(str); + if (!ret) return NULL; + +- tmp = scm_to_locale_string(str); +- memcpy(ret, tmp, l); +- free(tmp); +- +- ret[l] = '\0'; +- if (len) *len = l; ++ if (len) *len = strlen(ret) - 1; + return ret; + #undef FUNC_NAME + } +@@ -473,7 +469,7 @@ SWIG_Guile_GetArgs (SCM *dest, SCM rest, + int num_args_passed = 0; + for (i = 0; i /dev/null 2>&1`; then \ + patch $@ $(top_srcdir)/src/swig-utf8.patch; \ + fi swig-unittest-support-python.c: unittest-support.i $(top_srcdir)/src/base-typemaps.i $(SWIG) -python -Wall -Werror $(SWIG_ARGS) \