Skip to content

PyArg_ParseTuple(args, "u#", ...) misbehaves with -Werror #94864

@jwilk

Description

@jwilk

PyArg_ParseTuple(args, "u#", ...) generates a deprecation warning, as expected:

$ python3 --version
Python 3.11.0b4
$ python3 -c 'import _testcapi as t; t.getargs_u_hash("")'
<string>:1: DeprecationWarning: getargs: The 'u' format is deprecated. Use 'U' instead.

But when I turn warnings into exceptions, something weird happens:

$ python3 -Werror -c 'import _testcapi as t; t.getargs_u_hash("")'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ValueError: character U+b4000360 is not in range [U+0000; U+10ffff]

What's going on here? The code for getargs_u_hash() looks like this:

Py_UNICODE *str;
Py_ssize_t size;
if (!PyArg_ParseTuple(args, "u#", &str, &size))
    return NULL;
return PyUnicode_FromWideChar(str, size);

So it looks like PyArg_ParseTuple() returns true, but leaves str and size uninitialized.

Metadata

Metadata

Labels

3.10only security fixes3.11only security fixes

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions