[3.12] gh-69214: Fix fcntl.ioctl() request type (#119498) (#119505)

gh-69214: Fix fcntl.ioctl() request type (#119498)

Use an 'unsigned long' instead of an 'unsigned int' for the request
parameter of fcntl.ioctl() to support requests larger than UINT_MAX.

(cherry picked from commit 92fab3356f)
This commit is contained in:
Victor Stinner 2024-05-24 14:53:41 +02:00 committed by GitHub
parent 2b091b9aa9
commit 078da88ad1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 12 additions and 8 deletions

View file

@ -0,0 +1,3 @@
Fix ``fcntl.ioctl()`` *request* parameter: use an ``unsigned long`` instead of
an ``unsigned int`` for the *request* parameter of :func:`fcntl.ioctl` to
support requests larger than ``UINT_MAX``. Patch by Victor Stinner.

View file

@ -96,7 +96,7 @@ PyDoc_STRVAR(fcntl_ioctl__doc__,
{"ioctl", _PyCFunction_CAST(fcntl_ioctl), METH_FASTCALL, fcntl_ioctl__doc__},
static PyObject *
fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code,
fcntl_ioctl_impl(PyObject *module, int fd, unsigned long code,
PyObject *ob_arg, int mutate_arg);
static PyObject *
@ -104,7 +104,7 @@ fcntl_ioctl(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
int fd;
unsigned int code;
unsigned long code;
PyObject *ob_arg = NULL;
int mutate_arg = 1;
@ -114,10 +114,11 @@ fcntl_ioctl(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
code = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
if (code == (unsigned int)-1 && PyErr_Occurred()) {
if (!PyLong_Check(args[1])) {
_PyArg_BadArgument("ioctl", "argument 2", "int", args[1]);
goto exit;
}
code = PyLong_AsUnsignedLongMask(args[1]);
if (nargs < 3) {
goto skip_optional;
}
@ -249,4 +250,4 @@ skip_optional:
exit:
return return_value;
}
/*[clinic end generated code: output=1db859412172dd53 input=a9049054013a1b77]*/
/*[clinic end generated code: output=4362fb678c9c5447 input=a9049054013a1b77]*/

View file

@ -108,7 +108,7 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg)
fcntl.ioctl
fd: fildes
request as code: unsigned_int(bitwise=True)
request as code: unsigned_long(bitwise=True)
arg as ob_arg: object(c_default='NULL') = 0
mutate_flag as mutate_arg: bool = True
/
@ -144,9 +144,9 @@ code.
[clinic start generated code]*/
static PyObject *
fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code,
fcntl_ioctl_impl(PyObject *module, int fd, unsigned long code,
PyObject *ob_arg, int mutate_arg)
/*[clinic end generated code: output=7f7f5840c65991be input=967b4a4cbeceb0a8]*/
/*[clinic end generated code: output=3d8eb6828666cea1 input=cee70f6a27311e58]*/
{
#define IOCTL_BUFSZ 1024
/* We use the unsigned non-checked 'I' format for the 'code' parameter