[3.5] bpo-34623: Use XML_SetHashSalt in _elementtree (#9933) · python/cpython@41b48e7 (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 +CVE-2018-14647: The C accelerated _elementtree module now initializes hash
2 +randomization salt from _Py_HashSecret instead of libexpat's default CSPRNG.
Original file line number Diff line number Diff line change
@@ -3282,6 +3282,11 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *html,
3282 3282 PyErr_NoMemory();
3283 3283 return -1;
3284 3284 }
3285 +/* expat < 2.1.0 has no XML_SetHashSalt() */
3286 +if (EXPAT(SetHashSalt) != NULL) {
3287 +EXPAT(SetHashSalt)(self->parser,
3288 + (unsigned long)_Py_HashSecret.expat.hashsalt);
3289 + }
3285 3290
3286 3291 if (target) {
3287 3292 Py_INCREF(target);
Original file line number Diff line number Diff line change
@@ -1882,6 +1882,11 @@ MODULE_INITFUNC(void)
1882 1882 capi.SetStartDoctypeDeclHandler = XML_SetStartDoctypeDeclHandler;
1883 1883 capi.SetEncoding = XML_SetEncoding;
1884 1884 capi.DefaultUnknownEncodingHandler = PyUnknownEncodingHandler;
1885 +#if XML_COMBINED_VERSION >= 20100
1886 +capi.SetHashSalt = XML_SetHashSalt;
1887 +#else
1888 +capi.SetHashSalt = NULL;
1889 +#endif
1885 1890
1886 1891 /* export using capsule */
1887 1892 capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL);