From 2a1dd4d16d0da87ee4588fc40ee696b9e45197ad Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Mon, 14 Apr 2014 14:20:56 -0400 Subject: [PATCH] Fixes for bad castings on exhotic platfroms Backported from upstream --- ...rators-for-parsing-of-integer-values.patch | 38 ++++++ ...beral-use-of-casting-for-the-SNIPPET.patch | 108 ++++++++++++++++++ lasso.spec | 10 +- 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 0001-Fix-generators-for-parsing-of-integer-values.patch create mode 100644 0002-xml-xml.c-fix-liberal-use-of-casting-for-the-SNIPPET.patch diff --git a/0001-Fix-generators-for-parsing-of-integer-values.patch b/0001-Fix-generators-for-parsing-of-integer-values.patch new file mode 100644 index 0000000..b346032 --- /dev/null +++ b/0001-Fix-generators-for-parsing-of-integer-values.patch @@ -0,0 +1,38 @@ +From 0caa4e7b254b26d418048191aa588c6696a55a4d Mon Sep 17 00:00:00 2001 +From: Simo Sorce +Date: Thu, 17 Apr 2014 18:10:31 -0400 +Subject: [PATCH 1/2] Fix generators for parsing of integer values + +All number types including enums are parse as if they were integers, +this breaks in many ways, long and int are not the same size in all +architectures as well as enum may vary in size depening on compiler, +architecture and optimizations. + +Always pass an actual long to PyArg_ParseTuple() and rely on the a +cast from long to the destination variable type in the following +assignment. + +Signed-off-by: Simo Sorce +--- + bindings/python/lang.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/bindings/python/lang.py b/bindings/python/lang.py +index f5c9d36ec6bd4550a8edd4ba93e5f4862bd40139..c695518e5a553738f11d614c9ce98953338408b7 100644 +--- a/bindings/python/lang.py ++++ b/bindings/python/lang.py +@@ -770,9 +770,9 @@ register_constants(PyObject *d) + parse_arg = '&value' + print >> fd, ' %s value;' % type + elif is_int(m, self.binding_data): +- parse_format = 'i' ++ parse_format = 'l' + parse_arg = '&value' +- print >> fd, ' %s value;' % type ++ print >> fd, ' long value;' + elif is_glist(m) or is_hashtable(m) or is_xml_node(m) or is_boolean(m): + parse_format = 'O' + print >> fd, ' PyObject *cvt_value;' +-- +1.9.0 + diff --git a/0002-xml-xml.c-fix-liberal-use-of-casting-for-the-SNIPPET.patch b/0002-xml-xml.c-fix-liberal-use-of-casting-for-the-SNIPPET.patch new file mode 100644 index 0000000..e7b356c --- /dev/null +++ b/0002-xml-xml.c-fix-liberal-use-of-casting-for-the-SNIPPET.patch @@ -0,0 +1,108 @@ +From 53c4298876331c1312a9a0f4dbe6eb28b2dbea59 Mon Sep 17 00:00:00 2001 +From: Benjamin Dauvergne +Date: Thu, 24 Apr 2014 01:30:49 +0200 +Subject: [PATCH 2/2] xml/xml.c: fix liberal use of casting for the + SNIPPET_INTEGER and SNIPPET_BOOLEAN case + +Some behaviour are also made more explicit like the optional if equals +to -1 case for integer fields, and the optional if FALSE for boolean +fields. +--- + lasso/xml/xml.c | 55 ++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 34 insertions(+), 21 deletions(-) + +diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c +index ba207f552cf5c6a587c1866adecab9f2ac9a339a..4485d47669deb5b15c3f3cbcfec98942bd2edbf6 100644 +--- a/lasso/xml/xml.c ++++ b/lasso/xml/xml.c +@@ -2717,7 +2717,6 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, x + struct XmlSnippet *snippets, gboolean lasso_dump) + { + struct XmlSnippet *snippet; +- SnippetType type; + GType g_type; + xmlNode *t; + GList *elem; +@@ -2727,36 +2726,49 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, x + + for (snippet = snippets; snippet && snippet->name; snippet++) { + void *value; ++ int int_value; ++ gboolean bool_value; + char *str; ++ gboolean optional = snippet->type & SNIPPET_OPTIONAL; ++ gboolean optional_neg = snippet->type & SNIPPET_OPTIONAL_NEG; + + if (! snippet->offset && ! (snippet->type & SNIPPET_PRIVATE)) { + continue; + } +- type = snippet->type & 0xff; +- value = SNIPPET_STRUCT_MEMBER(void *, node, g_type, snippet); +- str = value; +- if (lasso_dump == FALSE && snippet->type & SNIPPET_LASSO_DUMP) ++ if (lasso_dump == FALSE && snippet->type & SNIPPET_LASSO_DUMP) { + continue; +- +- if (type == SNIPPET_ATTRIBUTE && snippet->type & SNIPPET_ANY) { ++ } ++ if ((snippet->type & 0xff) == SNIPPET_ATTRIBUTE && (snippet->type & SNIPPET_ANY)) { + snippet_any_attribute = snippet; + continue; + } +- if (value == NULL && (!(snippet->type & SNIPPET_BOOLEAN || +- snippet->type & SNIPPET_INTEGER) || +- snippet->type & SNIPPET_OPTIONAL)) +- continue; + +- if (snippet->type & SNIPPET_OPTIONAL_NEG && GPOINTER_TO_INT(value) == -1) +- continue; ++ // convert input type to string if needed ++ if (snippet->type & SNIPPET_INTEGER) { ++ int_value = SNIPPET_STRUCT_MEMBER(int, node, g_type, snippet); ++ if (int_value == 0 && optional) { ++ continue; ++ } ++ if (int_value == -1 && optional_neg) { ++ continue; ++ } ++ str = g_strdup_printf("%i", int_value); ++ } else if (snippet->type & SNIPPET_BOOLEAN) { ++ bool_value = SNIPPET_STRUCT_MEMBER(gboolean, node, g_type, snippet); ++ if (bool_value == FALSE && optional) { ++ continue; ++ } ++ str = bool_value ? "true" : "false"; ++ } else { ++ value = SNIPPET_STRUCT_MEMBER(void *, node, g_type, snippet); ++ if (value == NULL) { ++ continue; ++ } ++ str = value; ++ } + +- /* XXX: not sure it is 64-bits clean */ +- if (snippet->type & SNIPPET_BOOLEAN) +- str = GPOINTER_TO_INT(value) ? "true" : "false"; +- if (snippet->type & SNIPPET_INTEGER) +- str = g_strdup_printf("%d", GPOINTER_TO_INT(value)); +- +- switch (type) { ++ // output type ++ switch (snippet->type & 0xff) { + case SNIPPET_ATTRIBUTE: + if (snippet->ns_name) { + xmlNsPtr ns; +@@ -2840,8 +2852,9 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, x + case SNIPPET_UNUSED1: + g_assert_not_reached(); + } +- if (snippet->type & SNIPPET_INTEGER) ++ if (snippet->type & SNIPPET_INTEGER) { + lasso_release(str); ++ } + } + + if (snippet_any_attribute) { +-- +1.9.0 + diff --git a/lasso.spec b/lasso.spec index 0c4d342..adc1301 100644 --- a/lasso.spec +++ b/lasso.spec @@ -11,7 +11,7 @@ Summary: Liberty Alliance Single Sign On Name: lasso Version: 2.4.0 -Release: 1%{?dist} +Release: 2%{?dist} License: GPLv2+ Group: System Environment/Libraries Source: http://dev.entrouvert.org/lasso/lasso-%{version}.tar.gz @@ -24,6 +24,8 @@ BuildRequires: libxml2-devel, xmlsec1-devel, openssl-devel, xmlsec1-openssl-deve Url: http://lasso.entrouvert.org/ Patch01: 0001-Fix-java-version-detection.patch +Patch02: 0001-Fix-generators-for-parsing-of-integer-values.patch +Patch03: 0002-xml-xml.c-fix-liberal-use-of-casting-for-the-SNIPPET.patch %description Lasso is a library that implements the Liberty Alliance Single Sign On @@ -100,6 +102,8 @@ library. %prep %setup -q -n %{name}-%{version} %patch01 -p1 -b .java_version +%patch02 -p1 -b .generators +%patch03 -p1 -b .xml_casts %build ./autogen.sh @@ -202,6 +206,10 @@ rm -fr %{buildroot}%{_defaultdocdir}/%{name} %endif %changelog +* Fri Apr 25 2014 Simo Sorce - 2.4.0-2 +- Fixes for arches where pointers and integers do not have the same size + (ppc64, s390, etc..) + * Mon Apr 14 2014 Stanislav Ochotnicky - 2.4.0-1 - Use OpenJDK instead of GCJ for java bindings