Kaydet (Commit) eb36fdaa authored tarafından Victor Stinner's avatar Victor Stinner

Fix _PyUnicodeWriter_PrepareKind()

Initialize kind to 0 (PyUnicode_WCHAR_KIND) to ensure that
_PyUnicodeWriter_PrepareKind() handles correctly read-only buffer: copy the
buffer.
üst 11faa218
...@@ -13294,27 +13294,38 @@ unicode_endswith(PyObject *self, ...@@ -13294,27 +13294,38 @@ unicode_endswith(PyObject *self,
Py_LOCAL_INLINE(void) Py_LOCAL_INLINE(void)
_PyUnicodeWriter_Update(_PyUnicodeWriter *writer) _PyUnicodeWriter_Update(_PyUnicodeWriter *writer)
{ {
if (!writer->readonly) writer->maxchar = PyUnicode_MAX_CHAR_VALUE(writer->buffer);
writer->data = PyUnicode_DATA(writer->buffer);
if (!writer->readonly) {
writer->kind = PyUnicode_KIND(writer->buffer);
writer->size = PyUnicode_GET_LENGTH(writer->buffer); writer->size = PyUnicode_GET_LENGTH(writer->buffer);
}
else { else {
/* use a value smaller than PyUnicode_1BYTE_KIND() so
_PyUnicodeWriter_PrepareKind() will copy the buffer. */
writer->kind = PyUnicode_WCHAR_KIND;
assert(writer->kind <= PyUnicode_1BYTE_KIND);
/* Copy-on-write mode: set buffer size to 0 so /* Copy-on-write mode: set buffer size to 0 so
* _PyUnicodeWriter_Prepare() will copy (and enlarge) the buffer on * _PyUnicodeWriter_Prepare() will copy (and enlarge) the buffer on
* next write. */ * next write. */
writer->size = 0; writer->size = 0;
} }
writer->maxchar = PyUnicode_MAX_CHAR_VALUE(writer->buffer);
writer->data = PyUnicode_DATA(writer->buffer);
writer->kind = PyUnicode_KIND(writer->buffer);
} }
void void
_PyUnicodeWriter_Init(_PyUnicodeWriter *writer) _PyUnicodeWriter_Init(_PyUnicodeWriter *writer)
{ {
memset(writer, 0, sizeof(*writer)); memset(writer, 0, sizeof(*writer));
#ifdef Py_DEBUG
writer->kind = 5; /* invalid kind */ /* ASCII is the bare minimum */
#endif
writer->min_char = 127; writer->min_char = 127;
/* use a value smaller than PyUnicode_1BYTE_KIND() so
_PyUnicodeWriter_PrepareKind() will copy the buffer. */
writer->kind = PyUnicode_WCHAR_KIND;
assert(writer->kind <= PyUnicode_1BYTE_KIND);
} }
int int
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment