From 3a2efbc8670f72a524cc7290e11559cdb42852a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 20 Sep 2019 12:21:19 +0200 Subject: [PATCH] gnu: python-libxml2, itstool: Provide crash-free variants. Fixes . * gnu/packages/patches/python-libxml2-utf8.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/xml.scm (python-libxml2/fixed): New variable. * gnu/packages/glib.scm (itstool/fixed): New variable. * gnu/packages/gnome.scm (gnumeric)[native-inputs]: Use ITSTOOL/FIXED instead of ITSTOOL. --- gnu/local.mk | 1 + gnu/packages/glib.scm | 11 +++++ gnu/packages/gnome.scm | 2 +- .../patches/python-libxml2-utf8.patch | 40 +++++++++++++++++++ gnu/packages/xml.scm | 15 ++++++- 5 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 gnu/packages/patches/python-libxml2-utf8.patch diff --git a/gnu/local.mk b/gnu/local.mk index 63d55c5018..5705494090 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1252,6 +1252,7 @@ dist_patch_DATA = \ %D%/packages/patches/python-keras-integration-test.patch \ %D%/packages/patches/python-pyfakefs-remove-bad-test.patch \ %D%/packages/patches/python-flint-includes.patch \ + %D%/packages/patches/python-libxml2-utf8.patch \ %D%/packages/patches/python-mox3-python3.6-compat.patch \ %D%/packages/patches/python-testtools.patch \ %D%/packages/patches/python-paste-remove-timing-test.patch \ diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm index ad000ad838..a2f0f2fd8e 100644 --- a/gnu/packages/glib.scm +++ b/gnu/packages/glib.scm @@ -65,6 +65,7 @@ #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) + #:use-module (srfi srfi-1) ;; Export variables up-front to allow circular dependency with the 'xorg' ;; module. @@ -495,6 +496,16 @@ information in their documents, such as whether a particular element should be translated.") (license license:gpl3+))) +(define-public itstool/fixed + ;; This variant fixes a python-libxml2 crash when processing UTF-8 + ;; sequences: . Since the issue is quite rare, + ;; create this variant here to avoid a full rebuild. + (package/inherit + itstool + (inputs + `(("python-libxml2" ,python-libxml2/fixed) + ,@(alist-delete "python-libxml2" (package-inputs itstool)))))) + (define dbus-glib (package (name "dbus-glib") diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm index 520d04d75f..03550b6fa8 100644 --- a/gnu/packages/gnome.scm +++ b/gnu/packages/gnome.scm @@ -2167,7 +2167,7 @@ Hints specification (EWMH).") `(("bison" ,bison) ("docbook-xml" ,docbook-xml) ("intltool" ,intltool) - ("itstool" ,itstool) + ("itstool" ,itstool/fixed) ;see ("glib:bin" ,glib "bin") ("pkg-config" ,pkg-config))) (home-page "http://www.gnumeric.org") diff --git a/gnu/packages/patches/python-libxml2-utf8.patch b/gnu/packages/patches/python-libxml2-utf8.patch new file mode 100644 index 0000000000..e39672faa1 --- /dev/null +++ b/gnu/packages/patches/python-libxml2-utf8.patch @@ -0,0 +1,40 @@ +This patch fixes a crash in the libxml2 bindings for Python 3.x +that 'itstool' stumbles upon when processing UTF-8 data: + + https://issues.guix.gnu.org/issue/37468 + +Patch by Jan Matejek +from . + +--- libxml2-2.9.5.orig/python/libxml.c ++++ libxml2-2.9.5/python/libxml.c +@@ -1620,6 +1620,7 @@ libxml_xmlErrorFuncHandler(ATTRIBUTE_UNU + PyObject *message; + PyObject *result; + char str[1000]; ++ unsigned char *ptr = (unsigned char *)str; + + #ifdef DEBUG_ERROR + printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); +@@ -1636,12 +1637,20 @@ libxml_xmlErrorFuncHandler(ATTRIBUTE_UNU + str[999] = 0; + va_end(ap); + ++#if PY_MAJOR_VERSION >= 3 ++ /* Ensure the error string doesn't start at UTF8 continuation. */ ++ while (*ptr && (*ptr & 0xc0) == 0x80) ++ ptr++; ++#endif ++ + list = PyTuple_New(2); + PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); + Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); +- message = libxml_charPtrConstWrap(str); ++ message = libxml_charPtrConstWrap(ptr); + PyTuple_SetItem(list, 1, message); + result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); ++ /* Forget any errors caused in the error handler. */ ++ PyErr_Clear(); + Py_XDECREF(list); + Py_XDECREF(result); + } diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm index 78b9b713e5..b8f3774039 100644 --- a/gnu/packages/xml.scm +++ b/gnu/packages/xml.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015, 2016, 2018 Ludovic Courtès +;;; Copyright © 2013, 2014, 2015, 2016, 2018, 2019 Ludovic Courtès ;;; Copyright © 2013, 2015 Andreas Enge ;;; Copyright © 2015 Eric Bavier ;;; Copyright © 2015 Sou Bunnbu @@ -164,6 +164,7 @@ project (but it is usable outside of the Gnome platform).") (license license:x11))) (define-public python-libxml2 + ;; TODO: Merge with 'python-libxml2/fixed' on the next rebuild cycle. (package/inherit libxml2 (name "python-libxml2") (build-system python-build-system) @@ -191,6 +192,18 @@ project (but it is usable outside of the Gnome platform).") (inputs `(("libxml2" ,libxml2))) (synopsis "Python bindings for the libxml2 library"))) +(define-public python-libxml2/fixed + ;; This variant fixes a crash when processing UTF-8 sequences: + ;; + ;; TODO: Merge with 'python-libxml2' on the next rebuild cycle. + (package/inherit + python-libxml2 + (version (string-append (package-version python-libxml2) "-1")) + (source (origin + (inherit (package-source libxml2)) + (patches (cons (search-patch "python-libxml2-utf8.patch") + (origin-patches (package-source libxml2)))))))) + (define-public python2-libxml2 (package-with-python2 python-libxml2))