Repository navigation
ioctl mutate_flag behavior in regard to the buffer size limit #61038
Description
Activity
YuvalWeinbaum commented
on Jan 1, 2013 YuvalWeinbaummannequinMannequinAuthorMore actionsIn 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).
@yuval sorry about the delay in replying. Can a *nix person comment on this please as I stick with Windows.
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.
- addedextension-modulesC modules in the Modules dirC modules in the Modules dir
on Mar 19, 2015 - added3.8 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of life3.10 (EOL)end of lifeend of life
on Nov 6, 2020 Also, the mutate_flag parameter should be documented as positional only, otherwise it is too tempting to try using it as a keyword
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or errorand removed3.10 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of life3.8 (EOL)end of lifeend of life
on Apr 24, 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.
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsTodo
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: