Re: Regression with large XML data input
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Robert Treat <rob@xzilla.net>, Jim Jones <jim.jones@uni-muenster.de>, Postgres hackers <pgsql-hackers@lists.postgresql.org>, Erik Wienhold <ewie@ewie.name>
Date: 2025-07-28T02:47:59Z
Lists: pgsql-hackers
On Sun, Jul 27, 2025 at 10:16:47PM -0400, Tom Lane wrote: > Michael Paquier <michael@paquier.xyz> writes: >> This sentence is incorrect after I have double-checked the behaviors I >> am seeing based on local builds of libxml2 2.9.7 and 2.9.14. > > Hmm, okay, I misread Jim's results then. But there still remains > the big question: what reason is there to believe that it's safe > to return to the old behavior? If newer libxml2 versions report > XML_ERR_RESOURCE_LIMIT on the same input, doesn't it seem likely > that there's a live hazard in the old code? Yes, I guess that it's not entirely safe to use libxml2 2.9.X if we rely on the old code, but it also sucks for customers that relied on the old bevahior to not have a way out in stable branches, and there are still plenty of environments that rely on 2.9.X. That's the reason why I am suggesting an hybrid approach on stable branches where the regression shows up, where it would be possible to store large XML data values for *some* cases, keeping some compatibility: - if building Postgres with 2.13.X, use the new code, as on HEAD, forcing the restrictions. - if building Postgres with 2.12.X or older, then use the old code, as in what Postgres did before f68d6aabb. If one wants to enforce a stricter behavior, then it is enough to upgrade the version of libxml2 on a stable branch of PG. If one wants to preserve compatibility, then keep the older version of libxml2 but be aware that, while things are compatible in terms of input handling, libxml2 was unsafe and it was so for years. Hence, based on the number of environments still using 2.9.X, that seems worth the hack on stable branches. I am not going to argue against the commits that have reached REL_18_STABLE to add compatibility for libxml2 2.13.X, we can leave this stuff as-is and enforce stronger restrictions across all versions of libxml2, letting users deal with application changes across a major version change of PG. So, while it is not perfect and I'm aware of that my argument is not perfect, it would at least give packagers and users the option to use the previous compatibility layer if they want, leaving the stable branches of PG somewhat intact. What I think is bad for users is the fact that Postgres closes entirely this window, on a stable branch, even if this was accidental based on the previous coding style. I understand that from the point of view of a maintainer this is rather bad, but from the customer point of view the current situation is also bad to deal with in the scope of a minor upgrade, because applications suddenly break. -- Michael
Commits
-
Remove unnecessary complication around xmlParseBalancedChunkMemory.
- 902f92221889 19 (unreleased) landed
- cdcdabce5b70 14.19 landed
- 0ae824704070 13.22 landed
- 0928e18eb85a 15.14 landed
- d5f014d897c8 18.0 landed
- 762c6d8d26e0 16.10 landed
- 7571e0f6e924 17.6 landed
-
Avoid regression in the size of XML input that we will accept.
- 6d5e493b4a15 16.10 landed
- 589d6e6408b4 13.22 landed
- 0ffbd345e43d 15.14 landed
- 0395464aff02 14.19 landed
- fd4ad33fe223 17.6 landed
- 71c0921b649d 19 (unreleased) landed
- 637ead2e1aa1 18.0 landed
-
Use xmlParseInNodeContext not xmlParseBalancedChunkMemory.
- 6082b3d5d3d1 18.0 cited
-
Revert "Add support for parsing of large XML data (>= 10MB)"
- f2743a7d70e7 17.0 cited