You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ioctl mutate_flag behavior in regard to the buffer size limit #61038
In fcntl module, the documentation states the following regarding the mutate_flag in ioctl method:
If it is false, the buffer’s mutability is ignored and behaviour is as for a read-only buffer, except that the 1024 byte limit mentioned above is avoided – so long as the buffer you pass is as least as long as what the operating system wants to put there, things should work.
***
However, looking at the code (fcntlmodule.c) it seems that the 1024 bytes limitation is avoided when the mutate_flag is set to True (the opposite of what is stated in the doc).
Looking at the C code, if a writable buffer is passed, mutate_arg is false, and the buffer is longer than 1024 bytes, then a ValueError is raised:
>>> ioctl(0, 0, bytearray(2048), False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: ioctl string arg too long
So it seems the implementation does not match the documentation’s claim that “the 1024 byte limit . . . is avoided”. IMO this is an implementation bug.
But instead of (or in addition to) fixing it, maybe we could consider removing “mutate_flag” parameter altogether. It was originally added as a backwards compatibility helper for bpo-555817 in Python 2.3, and changed to True by default in Python 2.5.
The mutate_flag parameter is needed when we want to ensure that the mutable buffer argument will not be modified in-place.
The interface is indeed weird. Usually, when a function works with immutable argument, and you pass a mutable argument (list instead of tuple, bytearray instead of bytes), its mutability is just ignored. But in this case it causes radical behavior change.
It is also weird that passing true is ignored if the argument is not a mutable buffer, instead of raising an exception. But changing this will lead to a signature with optional argument without default value, which is currently not supported in the inspect module.
Activity
YuvalWeinbaum commentedon Jan 1, 2013
In fcntl module, the documentation states the following regarding the mutate_flag in ioctl method:
If it is false, the buffer’s mutability is ignored and behaviour is as for a read-only buffer, except that the 1024 byte limit mentioned above is avoided – so long as the buffer you pass is as least as long as what the operating system wants to put there, things should work.
***
However, looking at the code (fcntlmodule.c) it seems that the 1024 bytes limitation is avoided when the mutate_flag is set to True (the opposite of what is stated in the doc).
BreamoreBoy commentedon Jul 15, 2014
@yuval sorry about the delay in replying. Can a *nix person comment on this please as I stick with Windows.
vadmium commentedon Mar 19, 2015
Looking at the C code, if a writable buffer is passed, mutate_arg is false, and the buffer is longer than 1024 bytes, then a ValueError is raised:
So it seems the implementation does not match the documentation’s claim that “the 1024 byte limit . . . is avoided”. IMO this is an implementation bug.
But instead of (or in addition to) fixing it, maybe we could consider removing “mutate_flag” parameter altogether. It was originally added as a backwards compatibility helper for bpo-555817 in Python 2.3, and changed to True by default in Python 2.5.
vadmium commentedon Dec 18, 2024
Also, the mutate_flag parameter should be documented as positional only, otherwise it is too tempting to try using it as a keyword
serhiy-storchaka commentedon Apr 21, 2025
The documentation will be fixed in #132765,
and the implementation may be changed in #132768.serhiy-storchaka commentedon Apr 25, 2025
The mutate_flag parameter is needed when we want to ensure that the mutable buffer argument will not be modified in-place.
The interface is indeed weird. Usually, when a function works with immutable argument, and you pass a mutable argument (list instead of tuple, bytearray instead of bytes), its mutability is just ignored. But in this case it causes radical behavior change.
It is also weird that passing true is ignored if the argument is not a mutable buffer, instead of raising an exception. But changing this will lead to a signature with optional argument without default value, which is currently not supported in the inspect module.