bpo-34623: Use XML_SetHashSalt in _elementtree (GH-9146) · python/cpython@cb5778f (original) (raw)

File tree

4 files changed

lines changed

4 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
3 3
4 4 /* note: you must import expat.h before importing this module! */
5 5
6 -#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.0"
6 +#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.1"
7 7 #define PyExpat_CAPSULE_NAME "pyexpat.expat_CAPI"
8 8
9 9 struct PyExpat_CAPI
@@ -48,6 +48,8 @@ struct PyExpat_CAPI
48 48 enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding);
49 49 int (*DefaultUnknownEncodingHandler)(
50 50 void *encodingHandlerData, const XML_Char *name, XML_Encoding *info);
51 +/* might be none for expat < 2.1.0 */
52 +int (*SetHashSalt)(XML_Parser parser, unsigned long hash_salt);
51 53 /* always add new stuff to the end! */
52 54 };
53 55
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
1 +The C accelerated _elementtree module now initializes hash randomization
2 +salt from _Py_HashSecret instead of libexpat's default CSPRNG.
Original file line number Diff line number Diff line change
@@ -3272,6 +3272,11 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
3272 3272 PyErr_NoMemory();
3273 3273 return -1;
3274 3274 }
3275 +/* expat < 2.1.0 has no XML_SetHashSalt() */
3276 +if (EXPAT(SetHashSalt) != NULL) {
3277 +EXPAT(SetHashSalt)(self->parser,
3278 + (unsigned long)_Py_HashSecret.expat.hashsalt);
3279 + }
3275 3280
3276 3281 if (target) {
3277 3282 Py_INCREF(target);
Original file line number Diff line number Diff line change
@@ -1877,6 +1877,11 @@ MODULE_INITFUNC(void)
1877 1877 capi.SetStartDoctypeDeclHandler = XML_SetStartDoctypeDeclHandler;
1878 1878 capi.SetEncoding = XML_SetEncoding;
1879 1879 capi.DefaultUnknownEncodingHandler = PyUnknownEncodingHandler;
1880 +#if XML_COMBINED_VERSION >= 20100
1881 +capi.SetHashSalt = XML_SetHashSalt;
1882 +#else
1883 +capi.SetHashSalt = NULL;
1884 +#endif
1880 1885
1881 1886 /* export using capsule */
1882 1887 capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL);