Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wXUXH-003IKN-0E for pgsql-bugs@arkaria.postgresql.org; Thu, 11 Jun 2026 01:48:47 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wXUXD-00Doi0-2Z for pgsql-bugs@arkaria.postgresql.org; Thu, 11 Jun 2026 01:48:43 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wXUXD-00Dohr-1d for pgsql-bugs@lists.postgresql.org; Thu, 11 Jun 2026 01:48:43 +0000 Received: from fhigh-a6-smtp.messagingengine.com ([103.168.172.157]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wXUX8-00000002RAL-0jya for pgsql-bugs@lists.postgresql.org; Thu, 11 Jun 2026 01:48:42 +0000 Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 00A22140008F; Wed, 10 Jun 2026 21:48:36 -0400 (EDT) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Wed, 10 Jun 2026 21:48:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paquier.xyz; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm1; t=1781142515; x=1781228915; bh=qxcf9sMYdD 6Vr3hmsFyH4bAhhMeWkXU+GY3zwnaYWIk=; b=0psyWPKYPaYZow7UGGiQU5kXbi F+LlMHDjV7gBXGADxBR0YhdlFWfPupyVw2cMYPevvc57MC9EI8M7oF0UbOpUof1g u3y9SjiAe9Vtvf+cpbkGw46DzUZizx7aal0hHbOf3Iuve8h+WsR7DYSi45rxc2/O /7UYojfRsrWq4t1Wtdciq8iwau+1IYYRT3wre3W1w/p2tSZOahd6l+kRqCp8me3D +7+lPpuQUW7RcF8BAxujnUEqz8V7fRPqj4+SS+77frcaPbvB/fSunivgIRPaDavw I6meXt7vrBY/h/wsMo5bEmCSQGzZkFwQDbQnFFkhhLBHsc4ml4U1cTWsEMUA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t= 1781142515; x=1781228915; bh=qxcf9sMYdD6Vr3hmsFyH4bAhhMeWkXU+GY3 zwnaYWIk=; b=NgOpXqA3G5Dn7mdiaEZDG0szPl0rggDmqMwg1l8aB8q32vNjgH0 FKriZffaiHOhCoY6A3UtBJmiuhT5neQxVtztNm+dYVX7AfdDKpAWV65ZXKlIEP8B F/zTVOiAbJtP4o7cN32bo5DUaawSEVHJabaxd5Hpvup/P1qs8ALnsTq/bldjxZ7u JcvehZoMuZawT/6qIKgFwayuqTC0luD7z8QFFScg/pfCvoB7DFFshEIILWBKtPQk i/VcjawDK/bWjduXMiDV4xh9mAeyeq750ZGHEg3K19JnirHJrzpHcYbl8/z28I3Z 7rzTpg7buFrk6DrK4OWZ8K+RUe0RQt5OnNw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGS7hEUKXcx1z168US/Y+KUIggUEWpA71sW25/MVVR4JQ9HPbchziY8Jzq0mBOCGz VmZJR/A+ePkWoN2kMWKXJPrUzzyQgCv8gf26QdZStqAipKqzWEH6H41f8a+HQfrHA7IzzA 6U6joVXcYVpbstbfjcQYec6miB1DHLkxitPDX9U4tl9yId9zVfO0r3l6CSaj7fjL2jkTXB CvKdO+pa9NXer7EmrNoJnkKQrWNIJsGZxz6jhXNdLm+UO8UD46l+9c12ykek4GmstA0f75 oIK+Lr1YUNDPyEGD42RnlWeod6GSRkup78lmX8+i4kEt7Kyekjw8ahj8UWiXHVutsErpkS WSoucOuxgNAPeIHMLGVUJ81bdDkCaTl2HzvfY5j9/U53bfmRQu7baTHQSJmyquxW5ehvCI TJgwDc0j8QiusNqyFdUATOsgDHmao86lID27JD8AovlxowTtBYRQN9IpY14xbdQwuSIW92 EZyYgMrOEN5SZvBRbnUyYct8f0yW71iyX77BkCk3D0UENyrWD8JvxCLbX0D9mGdWP0Bkwj VtOOaL5GeQ5DQY7/WY9GwxFYRwHwz3ZEjo5VlBwiqfc5Vpu7GpxNNvkGJgLWqUfy9F3Qvt /WqeCNO6VUVLy+EuluYpuw5AVpqR7RbAmu+T6QD5ZRCemiAyZtqhW02wNVhQ X-ME-Proxy: Feedback-ID: i0fe9450f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 10 Jun 2026 21:48:34 -0400 (EDT) Date: Thu, 11 Jun 2026 10:48:30 +0900 From: Michael Paquier To: Andrey Chernyy Cc: pgsql-bugs@lists.postgresql.org Subject: Re: [PATCH] contrib/xml2: backend crash in xpath_nodeset() on the namespace axis Message-ID: References: <20260611031436.5afde3cb@andrnote> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="6PfPrMsmHfVR1jJo" Content-Disposition: inline In-Reply-To: <20260611031436.5afde3cb@andrnote> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --6PfPrMsmHfVR1jJo Content-Type: multipart/mixed; boundary="XH4i2kpv9mCEifpe" Content-Disposition: inline --XH4i2kpv9mCEifpe Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Jun 11, 2026 at 03:14:36AM +0300, Andrey Chernyy wrote: > Reproduced on master; the same unguarded xmlNodeDump() call in > pgxmlNodeSetToText() is present on every supported back-branch (REL_18 > through REL_14). >=20 > Patch attached: render XML_NAMESPACE_DECL nodes with > xmlXPathCastNodeToString() like xpath_table() does. The repro then > returns the namespace text, ordinary node-set output is unchanged, and > the xml2 regression test passes. Thanks for the report, that looks about right to fix the way you are doing in xml2. Some tests and we should be good. Hmm. We have a second caller of xmlNodeDump() in the core backend code in adt/xml.c, leading to a confusing error if I try to use a namespace: =3D# select xpath('//namespace::*', ''::xml); ERROR: 53200: could not copy node CONTEXT: SQL function "xpath" statement 1 LOCATION: xml_ereport, xml.c:2082 It looks to me that we should fallback to xmlXPathCastNodeToString() when dealing with a NAMESPACE_DECL. The attached patch leads me to the following result, that looks much better: =3D# select xpath('//namespace::*', ''::xml); xpath ----------------------------------------------------------- {http://www.w3.org/XML/1998/namespace,http://example.com} (1 row) What do you think? That also deserves a backpatch to me, even if it is less worse than the xml2 crash you have reported. I have grouped this fix with your patch in the attached. Both still need some tests. Each fix deserves its own commit, that's just a quick FYI version. -- Michael --XH4i2kpv9mCEifpe Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v2-0001-xml2-don-t-crash-on-namespace-nodes-in-xpath_node.patch Content-Transfer-Encoding: quoted-printable =46rom 075d59e29cd4a1fd5595bb4fb2596f40e5a12569 Mon Sep 17 00:00:00 2001 =46rom: Michael Paquier Date: Thu, 11 Jun 2026 10:45:10 +0900 Subject: [PATCH v2] xml2: don't crash on namespace nodes in xpath_nodeset() pgxmlNodeSetToText() passed nodeTab[i]->doc to xmlNodeDump() without checking the node type. Namespace-axis results are XML_NAMESPACE_DECL nodes (xmlNs structs cast to xmlNodePtr) whose ->doc field is out of bounds, so xmlNodeDump() dereferenced a bogus pointer and crashed the backend. Render such nodes with xmlXPathCastNodeToString() instead, as xpath_table() already does. --- src/backend/utils/adt/xml.c | 3 ++- contrib/xml2/xpath.c | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 2c7f778cfdb7..a50992876cd6 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -4199,7 +4199,8 @@ xml_xmlnodetoxmltype(xmlNodePtr cur, PgXmlErrorContex= t *xmlerrcxt) { xmltype *result =3D NULL; =20 - if (cur->type !=3D XML_ATTRIBUTE_NODE && cur->type !=3D XML_TEXT_NODE) + if (cur->type !=3D XML_ATTRIBUTE_NODE && cur->type !=3D XML_TEXT_NODE && + cur->type !=3D XML_NAMESPACE_DECL) { void (*volatile nodefree) (xmlNodePtr) =3D NULL; volatile xmlBufferPtr buf =3D NULL; diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index 283bb51178d1..25a1cc47577a 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -188,16 +188,27 @@ pgxmlNodeSetToText(xmlNodeSetPtr nodeset, } else { + xmlNodePtr node =3D nodeset->nodeTab[i]; + if ((septagname !=3D NULL) && (xmlStrlen(septagname) > 0)) { xmlBufferWriteChar(buf, "<"); xmlBufferWriteCHAR(buf, septagname); xmlBufferWriteChar(buf, ">"); } - xmlNodeDump(buf, - nodeset->nodeTab[i]->doc, - nodeset->nodeTab[i], - 1, 0); + + if (node->type =3D=3D XML_NAMESPACE_DECL) + { + str =3D xmlXPathCastNodeToString(node); + if (str =3D=3D NULL || pg_xml_error_occurred(xmlerrcxt)) + xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, + "could not allocate node text"); + xmlBufferWriteCHAR(buf, str); + xmlFree(str); + str =3D NULL; + } + else + xmlNodeDump(buf, node->doc, node, 1, 0); =20 if ((septagname !=3D NULL) && (xmlStrlen(septagname) > 0)) { --=20 2.54.0 --XH4i2kpv9mCEifpe-- --6PfPrMsmHfVR1jJo Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEG72nH6vTowiyblFKnvQgOdbyQH0FAmoqE+4ACgkQnvQgOdby QH1Nvw/9FPIlnnl4TGbZlECYo05Ix0u3uyuP0+xpWrhJbUPKdXQ/Q+HIauHt14d0 aITqzpycUIsFEfBuTXATPWSB3YNh9yy37/F6U07vhr91/OJMuEgfIvBy+pRoY8qD dV2rtykAQiRbXbO6Pk3rb34yXBQ3oGMtLPsuXli0QcsOqVt63mzhKEhAEtyeKC7q 1tQ7TEpDaQ0bKqyqrMS4SMFKJZaInIL498uwWh3kHFTEkgI0CoEuNnDt5E61eA2J +r2P0SCbmedyMHJjyhpNfrnWqTc49bk5aE2E8r4QYnNnJyEixrQH8AxbWeGRpcBi XQfndDzMB/qCqq4/X21VzegoxUs6xnA3ezHEkBfAp8Tgsg7DzMsKlQ2ML7rFFVhb Q7JaKmdyv4fKj+G+JFaFWQv7J5xQa3e8jM293MoNB5UisbLHynhbaUwXbQ5+RvNE LL1QrasHzMIDdq1tglc3xxZA0ETk2PSh7G0Hxj8hGx1h3jot56aZqCcvOeq7+iUL kiuLvYT99Se9ngIBGLimRovx95c6LITgNKkVy8GURutD9xtrULOTGzGKwzq+O1AB n+ptiP7p8QR1IWINac/pRtC8CY3RCx1uTqvA6V+fNjHASXm2cFAV67Y8wCek3pVA VsTVEbFd2oT1wv993In4/pMciK/RpRpCbf+JS0z3ut7Joswkr/g= =cXZP -----END PGP SIGNATURE----- --6PfPrMsmHfVR1jJo--