Eryk Sun <eryk...@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 <rep...@bugs.python.org>
<https://bugs.python.org/issue37705>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to