Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package libinfinity Fix a crash that could occur when it is noticed at send time that a connection is down. Fix a broken recommends. 0001-Fix-a-crash-when-a-connection-goes-down-while-attemp.patch adds some state tracking to see if the data processing handler is currently in XML or TLS processing and frees resources accordingly. 0001-Rework-Gtk3-support.patch had to be refreshed to be able to apply correctly. Sorry for not reordering the series so that this wouldn't have been necessary. unblock libinfinity/0.5.2-5 Thanks Philipp Kern
Base version: libinfinity_0.5.2-3 from testing Target version: libinfinity_0.5.2-5 from unstable No hints in place. changelog | 18 control | 2 patches/0001-Fix-a-crash-when-a-connection-goes-down-while-attemp.patch | 393 ++++++++++ patches/0001-Rework-Gtk3-support.patch | 47 - patches/series | 1 5 files changed, 435 insertions(+), 26 deletions(-) gpgv: keyblock resource `/home/pkern/.gnupg/trustedkeys.gpg': file open error gpgv: Signature made Sat 02 Jun 2012 10:19:37 PM UTC using DSA key ID B2CFCDD8 gpgv: Can't check signature: public key not found dpkg-source: warning: failed to verify signature on /tmp/tmpRo6cmB/libinfinity_0.5.2-3.dsc gpgv: keyblock resource `/home/pkern/.gnupg/trustedkeys.gpg': file open error gpgv: Signature made Tue 23 Oct 2012 10:18:42 PM UTC using RSA key ID 35D056EC gpgv: Can't check signature: public key not found dpkg-source: warning: failed to verify signature on /tmp/tmpRo6cmB/libinfinity_0.5.2-5.dsc diff -Nru libinfinity-0.5.2/debian/changelog libinfinity-0.5.2/debian/changelog --- libinfinity-0.5.2/debian/changelog 2012-06-02 21:59:24.000000000 +0000 +++ libinfinity-0.5.2/debian/changelog 2012-10-23 22:08:40.000000000 +0000 @@ -1,3 +1,21 @@ +libinfinity (0.5.2-5) unstable; urgency=low + + * Fix a crash when a connection goes down while attempting to + send data. + * Revert "Mark infinoted multi-arch:foreign". It would not be useful + in wheezy. + * Refresh patch "Rework Gtk3 support". + + -- Philipp Kern <pk...@debian.org> Wed, 24 Oct 2012 00:04:51 +0200 + +libinfinity (0.5.2-4) unstable; urgency=low + + * Recommend the correct infgtk3 library package in libinfinity-0.5-dbg. + (Closes: #680444) + * Mark infinoted multi-arch:foreign. + + -- Philipp Kern <pk...@debian.org> Tue, 10 Jul 2012 12:34:18 -0600 + libinfinity (0.5.2-3) unstable; urgency=low * Make infinoted the real daemon package, providing the non-versioned diff -Nru libinfinity-0.5.2/debian/control libinfinity-0.5.2/debian/control --- libinfinity-0.5.2/debian/control 2012-06-02 21:36:41.000000000 +0000 +++ libinfinity-0.5.2/debian/control 2012-10-23 22:06:54.000000000 +0000 @@ -42,7 +42,7 @@ Architecture: any Pre-Depends: dpkg (>= 1.15.6) Depends: ${misc:Depends}, libinfinity-0.5-0 (= ${binary:Version}) -Recommends: libinfgtk-0.5-0 (= ${binary:Version}), infinoted-0.5 (= ${binary:Version}) +Recommends: libinfgtk3-0.5-0 (= ${binary:Version}), infinoted-0.5 (= ${binary:Version}) Description: infinote-based collaborative editing - debugging symbols libinfinity is library to build collaborative text editors. Changes to the text buffers are synced to all other clients over a central server. diff -Nru libinfinity-0.5.2/debian/patches/0001-Fix-a-crash-when-a-connection-goes-down-while-attemp.patch libinfinity-0.5.2/debian/patches/0001-Fix-a-crash-when-a-connection-goes-down-while-attemp.patch --- libinfinity-0.5.2/debian/patches/0001-Fix-a-crash-when-a-connection-goes-down-while-attemp.patch 1970-01-01 00:00:00.000000000 +0000 +++ libinfinity-0.5.2/debian/patches/0001-Fix-a-crash-when-a-connection-goes-down-while-attemp.patch 2012-10-23 22:03:30.000000000 +0000 @@ -0,0 +1,393 @@ +From 9469bdf6116857c9d4c3df154dadb942285c9d98 Mon Sep 17 00:00:00 2001 +From: Armin Burgmeier <ar...@arbur.net> +Date: Sun, 21 Oct 2012 17:14:35 +0200 +Subject: [PATCH] Fix a crash when a connection goes down while attempting to + send data + +2012-10-21 Armin Burgmeier <ar...@arbur.net> + + * libinfinity/common/inf-xmpp-connection.c: Fix a crash that could + occur when it is noticed at send time that a connection is down. + +diff --git a/libinfinity/common/inf-xmpp-connection.c b/libinfinity/common/inf-xmpp-connection.c +index b6f7fe3..6bf2edb 100644 +--- a/libinfinity/common/inf-xmpp-connection.c ++++ b/libinfinity/common/inf-xmpp-connection.c +@@ -117,7 +117,7 @@ struct _InfXmppConnectionPrivate { + InfXmppConnectionMessage* last_message; + + /* XML parsing */ +- gboolean parsing; /* Whether we are currently in an XML parser callback */ ++ guint parsing; /* Whether we are currently in an XML parser or GnuTLS callback */ + xmlParserCtxtPtr parser; + xmlNodePtr root; + xmlNodePtr cur; +@@ -543,6 +543,71 @@ inf_xmpp_connection_pop_message(InfXmppConnection* connection) + g_slice_free(InfXmppConnectionMessage, message); + } + ++/* Note that this function does not change the state of xmpp, so it might ++ * rest in a state where it expects to actually have the resources available ++ * that are cleared here. Be sure to adjust state after having called ++ * this function. */ ++static void ++inf_xmpp_connection_clear(InfXmppConnection* xmpp) ++{ ++ InfXmppConnectionPrivate* priv; ++ priv = INF_XMPP_CONNECTION_PRIVATE(xmpp); ++ ++ g_object_freeze_notify(G_OBJECT(xmpp)); ++ ++ if(priv->sasl_session != NULL) ++ { ++ inf_sasl_context_stop_session(priv->sasl_context, priv->sasl_session); ++ priv->sasl_session = NULL; ++ } ++ ++ if(priv->sasl_remote_mechanisms != NULL) ++ { ++ g_free(priv->sasl_remote_mechanisms); ++ priv->sasl_remote_mechanisms = NULL; ++ } ++ ++ if(priv->session != NULL) ++ { ++ gnutls_deinit(priv->session); ++ priv->session = NULL; ++ ++ g_object_notify(G_OBJECT(xmpp), "tls-enabled"); ++ } ++ ++ if(priv->parser != NULL) ++ { ++ xmlFreeParserCtxt(priv->parser); ++ priv->parser = NULL; ++ ++ if(priv->root != NULL) ++ { ++ xmlFreeNode(priv->root); ++ priv->root = NULL; ++ priv->cur = NULL; ++ } ++ } ++ ++ while(priv->messages != NULL) ++ inf_xmpp_connection_pop_message(xmpp); ++ ++ if(priv->buf != NULL) ++ { ++ g_assert(priv->doc != NULL); ++ ++ xmlBufferFree(priv->buf); ++ xmlFreeDoc(priv->doc); ++ ++ priv->buf = NULL; ++ priv->doc = NULL; ++ } ++ ++ priv->pull_data = NULL; ++ priv->pull_len = 0; ++ ++ g_object_thaw_notify(G_OBJECT(xmpp)); ++} ++ + static void + inf_xmpp_connection_send_chars(InfXmppConnection* xmpp, + gconstpointer data, +@@ -554,11 +619,18 @@ inf_xmpp_connection_send_chars(InfXmppConnection* xmpp, + + priv = INF_XMPP_CONNECTION_PRIVATE(xmpp); + +- g_assert(priv->status != INF_XMPP_CONNECTION_HANDSHAKING); ++ g_assert(priv->status != INF_XMPP_CONNECTION_HANDSHAKING && ++ priv->status != INF_XMPP_CONNECTION_CLOSED); + + if(INF_XMPP_CONNECTION_PRINT_TRAFFIC) + printf("\033[00;34m%.*s\033[00;00m\n", (int)len, (const char*)data); + ++ /* From here on we go into a GnuTLS callback. Set this flag to prevent ++ * premature cleanup -- make sure that if the connection is being brought ++ * down from a GnuTLS callback then we keep the GnuTLS context around ++ * until the gntuls_record_send() call finishes. */ ++ ++priv->parsing; ++ + if(priv->session != NULL) + { + do +@@ -576,6 +648,7 @@ inf_xmpp_connection_send_chars(InfXmppConnection* xmpp, + g_error_free(error); + + inf_tcp_connection_close(priv->tcp); ++ break; + } + else if(cur_bytes == 0) + { +@@ -596,6 +669,19 @@ inf_xmpp_connection_send_chars(InfXmppConnection* xmpp, + priv->position += len; + inf_tcp_connection_send(priv->tcp, data, len); + } ++ ++ g_assert(priv->parsing > 0); ++ if(--priv->parsing == 0) ++ { ++ if(priv->status == INF_XMPP_CONNECTION_CLOSED) ++ { ++ /* Status changed to CLOSED, so while attempting to send data we noticed ++ * that the connection is down. Clear up. We didn't clean up in the ++ * disconnection callback because we wanted to keep the gnutls context ++ * alive until gnutls_record_send() returns. */ ++ inf_xmpp_connection_clear(xmpp); ++ } ++ } + } + + static void +@@ -611,6 +697,7 @@ inf_xmpp_connection_send_xml(InfXmppConnection* xmpp, + xmlDocSetRootElement(priv->doc, xml); + xmlNodeDump(priv->buf, priv->doc, xml, 0, 0); + xmlUnlinkNode(xml); ++ xmlSetListDoc(xml, NULL); + + inf_xmpp_connection_send_chars( + xmpp, +@@ -618,72 +705,11 @@ inf_xmpp_connection_send_xml(InfXmppConnection* xmpp, + xmlBufferLength(priv->buf) + ); + +- xmlBufferEmpty(priv->buf); +-} +- +-/* Note that this function does not change the state of xmpp, so it might +- * rest in a state where it expects to actually have the resources available +- * that are cleared here. Be sure to adjust state after having called +- * this function. */ +-static void +-inf_xmpp_connection_clear(InfXmppConnection* xmpp) +-{ +- InfXmppConnectionPrivate* priv; +- priv = INF_XMPP_CONNECTION_PRIVATE(xmpp); +- +- g_object_freeze_notify(G_OBJECT(xmpp)); +- +- if(priv->sasl_session != NULL) +- { +- inf_sasl_context_stop_session(priv->sasl_context, priv->sasl_session); +- priv->sasl_session = NULL; +- } +- +- if(priv->sasl_remote_mechanisms != NULL) +- { +- g_free(priv->sasl_remote_mechanisms); +- priv->sasl_remote_mechanisms = NULL; +- } +- +- if(priv->session != NULL) +- { +- gnutls_deinit(priv->session); +- priv->session = NULL; +- +- g_object_notify(G_OBJECT(xmpp), "tls-enabled"); +- } +- +- if(priv->parser != NULL) +- { +- xmlFreeParserCtxt(priv->parser); +- priv->parser = NULL; +- +- if(priv->root != NULL) +- { +- xmlFreeNode(priv->root); +- priv->root = NULL; +- priv->cur = NULL; +- } +- } +- +- while(priv->messages != NULL) +- inf_xmpp_connection_pop_message(xmpp); +- ++ /* The connection might be closed & cleared as a result from ++ * inf_xmpp_connection_send_chars(), so make sure the buffer still ++ * exists before emptying it. */ + if(priv->buf != NULL) +- { +- g_assert(priv->doc != NULL); +- +- xmlBufferFree(priv->buf); +- xmlFreeDoc(priv->doc); +- +- priv->buf = NULL; +- priv->doc = NULL; +- } +- +- priv->pull_data = NULL; +- priv->pull_len = 0; +- +- g_object_thaw_notify(G_OBJECT(xmpp)); ++ xmlBufferEmpty(priv->buf); + } + + /* +@@ -778,7 +804,7 @@ inf_xmpp_connection_terminate(InfXmppConnection* xmpp) + } + + /* Clear resources such as GnuTLS session and XML parser */ +- if(!priv->parsing) ++ if(priv->parsing == 0) + inf_xmpp_connection_clear(xmpp); + + /* The Change from CLOSING_STREAM to CLOSING_GNUTLS does not change +@@ -1327,7 +1353,7 @@ inf_xmpp_connection_sasl_finish(InfXmppConnection* xmpp, + /* We might be in a XML callback here, so do not initiate the stream right + * now because it replaces the XML parser. The stream is reinitiated in + * received_cb(). */ +- if(!priv->parsing) ++ if(priv->parsing == 0) + inf_xmpp_connection_initiate(xmpp); + } + else +@@ -2973,13 +2999,13 @@ inf_xmpp_connection_received_cb(InfTcpConnection* tcp, + + g_object_ref(xmpp); + +- g_assert(priv->parsing == FALSE); ++ g_assert(priv->parsing == 0); + g_assert(priv->parser != NULL); + + /* Let callbacks know that we start XML parsing. In case of deinitialization + * this tells them to keep the XML parser alive. We clean up after parsing + * in that case. */ +- priv->parsing = TRUE; ++ ++priv->parsing; + + if(priv->status != INF_XMPP_CONNECTION_HANDSHAKING) + { +@@ -3058,35 +3084,37 @@ inf_xmpp_connection_received_cb(InfTcpConnection* tcp, + priv->pull_len == 0); + } + +- priv->parsing = FALSE; +- +- if(priv->status == INF_XMPP_CONNECTION_CLOSING_GNUTLS || +- priv->status == INF_XMPP_CONNECTION_CLOSED) ++ g_assert(priv->parsing > 0); ++ if(--priv->parsing == 0) + { +- /* Status changed to CLOSING_GNUTLS, this means that someone called +- * _terminate(). Clean up any resources in use (XML parser, GnuTLS +- * session etc. */ +- inf_xmpp_connection_clear(xmpp); ++ if(priv->status == INF_XMPP_CONNECTION_CLOSING_GNUTLS || ++ priv->status == INF_XMPP_CONNECTION_CLOSED) ++ { ++ /* Status changed to CLOSING_GNUTLS, this means that someone called ++ * _terminate(). Clean up any resources in use (XML parser, GnuTLS ++ * session etc. */ ++ inf_xmpp_connection_clear(xmpp); + +- if(priv->status != INF_XMPP_CONNECTION_CLOSED) ++ if(priv->status != INF_XMPP_CONNECTION_CLOSED) ++ { ++ /* Close the TCP connection after remaining stuff has been sent out ++ * in case it is not closed already. */ ++ inf_xmpp_connection_push_message( ++ xmpp, ++ inf_xmpp_connection_received_cb_sent_func, ++ NULL, ++ NULL ++ ); ++ } ++ } ++ else if(priv->status == INF_XMPP_CONNECTION_AUTH_CONNECTED) + { +- /* Close the TCP connection after remaining stuff has been sent out +- * in case it is not closed already. */ +- inf_xmpp_connection_push_message( +- xmpp, +- inf_xmpp_connection_received_cb_sent_func, +- NULL, +- NULL +- ); ++ /* Reinitiate connection after successful authentication */ ++ /* TODO: Only do this if status at the beginning of this call was ++ * AUTHENTICATING */ ++ inf_xmpp_connection_initiate(xmpp); + } + } +- else if(priv->status == INF_XMPP_CONNECTION_AUTH_CONNECTED) +- { +- /* Reinitiate connection after successful authentication */ +- /* TODO: Only do this if status at the beginning of this call was +- * AUTHENTICATING */ +- inf_xmpp_connection_initiate(xmpp); +- } + + g_object_unref(xmpp); + } +@@ -3124,7 +3152,7 @@ inf_xmpp_connection_notify_status_cb(InfTcpConnection* tcp, + * signal handler) then we can't delete the XML parser here (otherwise + * libxml2 crashes, understandably). Instead, just set the status to + * closed and clean up after XML parsing in _received_cb(). */ +- if(!priv->parsing) ++ if(priv->parsing == 0) + inf_xmpp_connection_clear(xmpp); + + priv->status = INF_XMPP_CONNECTION_CLOSED; +@@ -3364,7 +3392,7 @@ inf_xmpp_connection_init(GTypeInstance* instance, + priv->messages = NULL; + priv->last_message = NULL; + +- priv->parsing = FALSE; ++ priv->parsing = 0; + priv->parser = NULL; + priv->root = NULL; + priv->cur = NULL; +@@ -3707,7 +3735,7 @@ inf_xmpp_connection_xml_connection_close(InfXmlConnection* connection) + break; + case INF_XMPP_CONNECTION_CONNECTED: + case INF_XMPP_CONNECTION_AUTH_CONNECTED: +- g_assert(priv->parsing == FALSE); ++ g_assert(priv->parsing == 0); + inf_xmpp_connection_terminate(INF_XMPP_CONNECTION(connection)); + /* TODO: Shouldn't we close the TCP connection here, as in + * inf_xmpp_connection_received_cb()? */ +@@ -3730,7 +3758,7 @@ inf_xmpp_connection_xml_connection_close(InfXmlConnection* connection) + * wait on either successful or unsuccessful authentication result, + * and then close the connection normally. Actually, this is what + * inf_xmpp_connection_deinitiate is supposed to do. */ +- g_assert(priv->parsing == FALSE); ++ g_assert(priv->parsing == 0); + inf_xmpp_connection_terminate(INF_XMPP_CONNECTION(connection)); + /* TODO: Shouldn't we close the TCP connection here, as in + * inf_xmpp_connection_received_cb()? */ +@@ -3759,12 +3787,22 @@ inf_xmpp_connection_xml_connection_send(InfXmlConnection* connection, + + inf_xmpp_connection_send_xml(INF_XMPP_CONNECTION(connection), xml); + +- inf_xmpp_connection_push_message( +- INF_XMPP_CONNECTION(connection), +- inf_xmpp_connection_xml_connection_send_sent, +- inf_xmpp_connection_xml_connection_send_free, +- xml +- ); ++ /* It can happen that while calling inf_xmpp_connection_send_xml we ++ * notice that the connection is down. Only proceed with sent notification ++ * if the connection is still up and we could actually send the thing. */ ++ if(priv->status == INF_XMPP_CONNECTION_READY) ++ { ++ inf_xmpp_connection_push_message( ++ INF_XMPP_CONNECTION(connection), ++ inf_xmpp_connection_xml_connection_send_sent, ++ inf_xmpp_connection_xml_connection_send_free, ++ xml ++ ); ++ } ++ else ++ { ++ xmlFreeNode(xml); ++ } + } + + /* +-- +1.7.10.4 + diff -Nru libinfinity-0.5.2/debian/patches/0001-Rework-Gtk3-support.patch libinfinity-0.5.2/debian/patches/0001-Rework-Gtk3-support.patch --- libinfinity-0.5.2/debian/patches/0001-Rework-Gtk3-support.patch 2012-03-18 12:29:28.000000000 +0000 +++ libinfinity-0.5.2/debian/patches/0001-Rework-Gtk3-support.patch 2012-10-23 22:04:43.000000000 +0000 @@ -26,11 +26,11 @@ libinftextgtk/Makefile.am | 35 +++++++++++++++++++++++++++-------- 5 files changed, 80 insertions(+), 20 deletions(-) -diff --git a/Makefile.am b/Makefile.am -index 24c312b..61f8bb1 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -7,12 +7,12 @@ pkgconfig_DATA = \ +Index: libinfinity-0.5.2/Makefile.am +=================================================================== +--- libinfinity-0.5.2.orig/Makefile.am 2012-10-24 00:04:33.608932275 +0200 ++++ libinfinity-0.5.2/Makefile.am 2012-10-24 00:04:39.069053873 +0200 +@@ -7,12 +7,12 @@ if WITH_INFGTK SUBDIRS += libinfgtk @@ -45,11 +45,11 @@ endif if WITH_INFINOTED -diff --git a/configure.ac b/configure.ac -index 00bc007..351ab71 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -122,13 +122,18 @@ if test "x$with_gtk3" = "xyes" +Index: libinfinity-0.5.2/configure.ac +=================================================================== +--- libinfinity-0.5.2.orig/configure.ac 2012-10-24 00:04:35.528975035 +0200 ++++ libinfinity-0.5.2/configure.ac 2012-10-24 00:04:39.069053873 +0200 +@@ -122,13 +122,18 @@ then gtk_requirement="gtk+-3.0 >= 2.90.6" gtk_version=3 @@ -68,7 +68,7 @@ ################################### # libinftextgtk optional package -@@ -321,8 +326,8 @@ AC_CONFIG_FILES([ +@@ -326,8 +331,8 @@ AC_CONFIG_FILES( libinfinity-libinfinity_api_version.pc:libinfinity.pc.in libinftext-libinfinity_api_version.pc:libinftext.pc.in @@ -79,7 +79,7 @@ ) AC_OUTPUT -@@ -334,6 +339,7 @@ Build optional packages: +@@ -339,6 +344,7 @@ infinoted: $with_infinoted Enable support for: @@ -87,10 +87,10 @@ avahi: $use_avahi libdaemon: $use_libdaemon pam: $use_pam -diff --git a/libinfgtk/Makefile.am b/libinfgtk/Makefile.am -index 1826ae9..7daa6d3 100644 ---- a/libinfgtk/Makefile.am -+++ b/libinfgtk/Makefile.am +Index: libinfinity-0.5.2/libinfgtk/Makefile.am +=================================================================== +--- libinfinity-0.5.2.orig/libinfgtk/Makefile.am 2012-10-24 00:04:33.608932275 +0200 ++++ libinfinity-0.5.2/libinfgtk/Makefile.am 2012-10-24 00:04:39.073053962 +0200 @@ -1,24 +1,25 @@ # TODO: Find a way to have the version number set automatically. +if WITH_GTK3 @@ -124,7 +124,7 @@ inf-gtk-browser-model.h \ inf-gtk-browser-model-filter.h \ inf-gtk-browser-model-sort.h \ -@@ -30,7 +31,7 @@ libinfgtk_0_5_la_HEADERS = \ +@@ -30,7 +31,7 @@ inf-gtk-chat.h \ inf-gtk-io.h @@ -133,7 +133,7 @@ inf-gtk-browser-model.c \ inf-gtk-browser-model-filter.c \ inf-gtk-browser-model-sort.c \ -@@ -41,3 +42,21 @@ libinfgtk_0_5_la_SOURCES = \ +@@ -41,3 +42,21 @@ inf-gtk-certificate-view.c \ inf-gtk-chat.c \ inf-gtk-io.c @@ -155,10 +155,10 @@ +libinfgtk_0_5_ladir = \ + $(includedir)/libinfgtk-$(LIBINFINITY_API_VERSION)/libinfgtk +endif -diff --git a/libinftextgtk/Makefile.am b/libinftextgtk/Makefile.am -index 1dd0daa..0bdbafe 100644 ---- a/libinftextgtk/Makefile.am -+++ b/libinftextgtk/Makefile.am +Index: libinfinity-0.5.2/libinftextgtk/Makefile.am +=================================================================== +--- libinfinity-0.5.2.orig/libinftextgtk/Makefile.am 2012-10-24 00:04:33.608932275 +0200 ++++ libinfinity-0.5.2/libinftextgtk/Makefile.am 2012-10-24 00:04:39.073053962 +0200 @@ -1,34 +1,53 @@ # TODO: Find a way to have the version number set automatically. +if WITH_GTK3 @@ -221,6 +221,3 @@ +libinftextgtk_0_5_ladir = \ + $(includedir)/libinftextgtk-$(LIBINFINITY_API_VERSION)/libinftextgtk +endif --- -1.7.9.1 - diff -Nru libinfinity-0.5.2/debian/patches/series libinfinity-0.5.2/debian/patches/series --- libinfinity-0.5.2/debian/patches/series 2012-06-02 16:19:15.000000000 +0000 +++ libinfinity-0.5.2/debian/patches/series 2012-10-23 22:04:19.000000000 +0000 @@ -1,5 +1,6 @@ 0001-Check-for-libm-for-libinftextgtk.patch 0001-Fix-a-few-enumeration-type-registration.patch +0001-Fix-a-crash-when-a-connection-goes-down-while-attemp.patch 0001-Rework-Gtk3-support.patch 0002-gtk3-test-Makefile.am.patch 0003-gtk3-docs.patch Hints needed: unblock libinfinity/0.5.2-5