This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: msvcrt.locking crashes python
Type: crash Stage: resolved
Components: Windows Versions: Python 3.7, Python 3.6, Python 3.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: steve.dower Nosy List: RazerM, eryksun, paul.moore, python-dev, steve.dower, tim.golden, zach.ware
Priority: normal Keywords:

Created on 2017-01-30 17:30 by RazerM, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (7)
msg286495 - (view) Author: Frazer McLean (RazerM) * Date: 2017-01-30 17:30
On 3.5.2 and 3.5.3, but not 3.4.3 or 2.7.10 (Windows 64-bit), the third line causes Python to crash with exit code 0xC0000417.

import msvcrt
fp = open('file.txt', 'w')
msvcrt.locking(fp.fileno(), msvcrt.LK_NBLCK, -1)
print('End')

I came across this in the portalocker module. I don't think -1 is a valid third argument, but it doesn't raise an exception on Python 3.4 or 2.7.
msg286500 - (view) Author: Frazer McLean (RazerM) * Date: 2017-01-30 23:09
I ran it on AppVeyor to double check, the crash appears from 3.5 onwards as I saw on my computer.

https://ci.appveyor.com/project/RazerM/issue29392/build/3
msg286501 - (view) Author: Eryk Sun (eryksun) * (Python triager) Date: 2017-01-30 23:40
The old CRT doesn't do any parameter validation on the nbytes parameter. It just passes it directly to Windows LockFile as follows:

    LockFile((HANDLE)_get_osfhandle(fh), lockoffset, 0L, nbytes, 0L)

which is locking (DWORD)-1 bytes, i.e. 0xFFFFFFFF. This allows users to sneakily lock more than 2 GiB by passing a negative value. Python could do its own validation in 2.7 to raise an exception for negative values, but I think it's too late; that ship has sailed. 

The parameter is validated by the new CRT in 3.5+, which limits nbytes to non-negative values. There we need the _Py_BEGIN_SUPPRESS_IPH and _Py_END_SUPPRESS_IPH macros to handle the failed call without crashing the process.
msg287003 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2017-02-04 23:06
New changeset f48bdcd02b57 by Steve Dower in branch '3.5':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://hg.python.org/cpython/rev/f48bdcd02b57

New changeset 15bbb18d87fd by Steve Dower in branch '3.6':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://hg.python.org/cpython/rev/15bbb18d87fd

New changeset fb6a48fa8da3 by Steve Dower in branch 'default':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://hg.python.org/cpython/rev/fb6a48fa8da3
msg287012 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2017-02-05 00:00
New changeset cb0c9718f7bd13df67b0d7df88b6f5b197ef05a7 by Steve Dower in branch '3.5':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://github.com/python/cpython/commit/cb0c9718f7bd13df67b0d7df88b6f5b197ef05a7
msg287016 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2017-02-05 00:00
New changeset cb0c9718f7bd13df67b0d7df88b6f5b197ef05a7 by Steve Dower in branch 'master':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://github.com/python/cpython/commit/cb0c9718f7bd13df67b0d7df88b6f5b197ef05a7

New changeset ed8b523b9f6495806a38262ca9d1676bf7d5e830 by Steve Dower in branch 'master':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://github.com/python/cpython/commit/ed8b523b9f6495806a38262ca9d1676bf7d5e830

New changeset 01c3bdbb25068e7558ff8f275d0ed22c9f4e6b32 by Steve Dower in branch 'master':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://github.com/python/cpython/commit/01c3bdbb25068e7558ff8f275d0ed22c9f4e6b32
msg287021 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2017-02-05 00:00
New changeset ed8b523b9f6495806a38262ca9d1676bf7d5e830 by Steve Dower in branch '3.6':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://github.com/python/cpython/commit/ed8b523b9f6495806a38262ca9d1676bf7d5e830

New changeset cb0c9718f7bd13df67b0d7df88b6f5b197ef05a7 by Steve Dower in branch '3.6':
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
https://github.com/python/cpython/commit/cb0c9718f7bd13df67b0d7df88b6f5b197ef05a7
History
Date User Action Args
2022-04-11 14:58:42adminsetgithub: 73578
2018-05-28 22:31:29steve.dowersetstatus: open -> closed
2017-02-05 00:00:34python-devsetmessages: + msg287021
2017-02-05 00:00:31python-devsetmessages: + msg287016
2017-02-05 00:00:29python-devsetmessages: + msg287012
2017-02-04 23:06:23steve.dowersetassignee: steve.dower
resolution: fixed
stage: needs patch -> resolved
2017-02-04 23:06:04python-devsetnosy: + python-dev
messages: + msg287003
2017-01-30 23:51:18eryksunsetstage: needs patch
versions: + Python 3.6, Python 3.7
2017-01-30 23:40:32eryksunsetnosy: + eryksun
messages: + msg286501
2017-01-30 23:09:43RazerMsetmessages: + msg286500
2017-01-30 17:30:26RazerMcreate