Skip to content

Commit 53d2594

Browse files
maksververnwellnhof
authored andcommitted
[CVE-2025-32414] python: Read at most len/4 characters.
Fixes #889 by reserving space in the buffer for UTF-8 encoding of text.
1 parent 81f76df commit 53d2594

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

python/libxml.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,9 @@ xmlPythonFileReadRaw (void * context, char * buffer, int len) {
237237

238238
file = (PyObject *) context;
239239
if (file == NULL) return(-1);
240-
ret = PyObject_CallMethod(file, (char *) "read", (char *) "(i)", len);
240+
/* When read() returns a string, the length is in characters not bytes, so
241+
request at most len / 4 characters to leave space for UTF-8 encoding. */
242+
ret = PyObject_CallMethod(file, (char *) "read", (char *) "(i)", len / 4);
241243
if (ret == NULL) {
242244
printf("xmlPythonFileReadRaw: result is NULL\n");
243245
return(-1);
@@ -272,10 +274,12 @@ xmlPythonFileReadRaw (void * context, char * buffer, int len) {
272274
Py_DECREF(ret);
273275
return(-1);
274276
}
275-
if (lenread > len)
276-
memcpy(buffer, data, len);
277-
else
278-
memcpy(buffer, data, lenread);
277+
if (lenread < 0 || lenread > len) {
278+
printf("xmlPythonFileReadRaw: invalid lenread\n");
279+
Py_DECREF(ret);
280+
return(-1);
281+
}
282+
memcpy(buffer, data, lenread);
279283
Py_DECREF(ret);
280284
return(lenread);
281285
}
@@ -299,7 +303,9 @@ xmlPythonFileRead (void * context, char * buffer, int len) {
299303

300304
file = (PyObject *) context;
301305
if (file == NULL) return(-1);
302-
ret = PyObject_CallMethod(file, (char *) "io_read", (char *) "(i)", len);
306+
/* When io_read() returns a string, the length is in characters not bytes, so
307+
request at most len / 4 characters to leave space for UTF-8 encoding. */
308+
ret = PyObject_CallMethod(file, (char *) "io_read", (char *) "(i)", len / 4);
303309
if (ret == NULL) {
304310
printf("xmlPythonFileRead: result is NULL\n");
305311
return(-1);
@@ -334,10 +340,12 @@ xmlPythonFileRead (void * context, char * buffer, int len) {
334340
Py_DECREF(ret);
335341
return(-1);
336342
}
337-
if (lenread > len)
338-
memcpy(buffer, data, len);
339-
else
340-
memcpy(buffer, data, lenread);
343+
if (lenread < 0 || lenread > len) {
344+
printf("xmlPythonFileRead: invalid lenread\n");
345+
Py_DECREF(ret);
346+
return(-1);
347+
}
348+
memcpy(buffer, data, lenread);
341349
Py_DECREF(ret);
342350
return(lenread);
343351
}

0 commit comments

Comments
 (0)