[issue37705] winerror_to_errno implementation
Eryk Sun
report at bugs.python.org
Tue Jul 30 14:35:10 EDT 2019
Eryk Sun <eryksun at gmail.com> added the comment:
Special casing of Winsock error codes should be handled in winerror_to_errno rather than in oserror_parse_args, so it's consistently applied everywhere. And it should use the proper range for Winsock, 10000-11999 -- not 10000-2147483647. Codes above the Winsock range should map to EINVAL. It's not a non-issue since this range has the following blocks allocated:
IPSEC 13000-13999
SXS 14000-14999
EVT 15000-15079
EC 15080-15099
MUI 15100-15199
MCA 15200-15249
SYSPART 15250-15299
VORTEX 15300-15320
GPIO 15321-15340
RUNLEVEL 15400-15500
COMTASK 15501-15510
APPX 15600-15699
APPMODEL 15700-15720
APPXSTATE 15800-15840
API 15841-15860
STORE 15861-15880
Another thing winerror_to_errno should do is unwrap HRESULT codes for Win32 errors (0x80070000-0x8007FFFF). In other words, 0x80070005 is effectively the same as ERROR_ACCESS_DENIED (5). It should be mapped to EACCES and raise PermissionError.
For example:
int
winerror_to_errno(int winerror)
{
/* Unwrap FACILITY_WIN32 HRESULT errors. */
if ((winerror & 0xFFFF0000) == 0x80070000) {
winerror &= 0x0000FFFF;
}
/* Winsock error codes (10000-11999) are errno values. */
if (winerror >= 10000 && winerror < 12000) {
return winerror;
}
switch(winerror) {
/* ... */
}
}
----------
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue37705>
_______________________________________
More information about the Python-bugs-list
mailing list