tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

win32_errors.c (12372B)


      1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "prerror.h"
      7 #include "prlog.h"
      8 #include <errno.h>
      9 #include <windows.h>
     10 
     11 /*
     12 * On Win32, we map three kinds of error codes:
     13 * - GetLastError(): for Win32 functions
     14 * - WSAGetLastError(): for Winsock functions
     15 * - errno: for standard C library functions
     16 *
     17 * GetLastError() and WSAGetLastError() return error codes in
     18 * non-overlapping ranges, so their error codes (ERROR_* and
     19 * WSAE*) can be mapped by the same function.  On the other hand,
     20 * errno and GetLastError() have overlapping ranges, so we need
     21 * to use a separate function to map errno.
     22 *
     23 * We do not check for WSAEINPROGRESS and WSAEINTR because we do not
     24 * use blocking Winsock 1.1 calls.
     25 *
     26 * Except for the 'socket' call, we do not check for WSAEINITIALISED.
     27 * It is assumed that if Winsock is not initialized, that fact will
     28 * be detected at the time we create new sockets.
     29 */
     30 
     31 static void _MD_win32_map_default_errno(PRInt32 err) {
     32  PRErrorCode prError;
     33 
     34  switch (err) {
     35    case EACCES:
     36      prError = PR_NO_ACCESS_RIGHTS_ERROR;
     37      break;
     38    case ENOENT:
     39      prError = PR_FILE_NOT_FOUND_ERROR;
     40      break;
     41    default:
     42      prError = PR_UNKNOWN_ERROR;
     43      break;
     44  }
     45  PR_SetError(prError, err);
     46 }
     47 
     48 void _MD_win32_map_default_error(PRInt32 err) {
     49  PRErrorCode prError;
     50 
     51  switch (err) {
     52    case ERROR_ACCESS_DENIED:
     53      prError = PR_NO_ACCESS_RIGHTS_ERROR;
     54      break;
     55    case ERROR_ALREADY_EXISTS:
     56      prError = PR_FILE_EXISTS_ERROR;
     57      break;
     58    case ERROR_CALL_NOT_IMPLEMENTED:
     59      prError = PR_NOT_IMPLEMENTED_ERROR;
     60      break;
     61    case ERROR_DISK_CORRUPT:
     62      prError = PR_IO_ERROR;
     63      break;
     64    case ERROR_DISK_FULL:
     65      prError = PR_NO_DEVICE_SPACE_ERROR;
     66      break;
     67    case ERROR_DISK_OPERATION_FAILED:
     68      prError = PR_IO_ERROR;
     69      break;
     70    case ERROR_DRIVE_LOCKED:
     71      prError = PR_FILE_IS_LOCKED_ERROR;
     72      break;
     73    case ERROR_FILENAME_EXCED_RANGE:
     74      prError = PR_NAME_TOO_LONG_ERROR;
     75      break;
     76    case ERROR_FILE_CORRUPT:
     77      prError = PR_IO_ERROR;
     78      break;
     79    case ERROR_FILE_EXISTS:
     80      prError = PR_FILE_EXISTS_ERROR;
     81      break;
     82    case ERROR_FILE_INVALID:
     83      prError = PR_BAD_DESCRIPTOR_ERROR;
     84      break;
     85    case ERROR_FILE_NOT_FOUND:
     86      prError = PR_FILE_NOT_FOUND_ERROR;
     87      break;
     88    case ERROR_HANDLE_DISK_FULL:
     89      prError = PR_NO_DEVICE_SPACE_ERROR;
     90      break;
     91    case ERROR_INVALID_ADDRESS:
     92      prError = PR_ACCESS_FAULT_ERROR;
     93      break;
     94    case ERROR_INVALID_HANDLE:
     95      prError = PR_BAD_DESCRIPTOR_ERROR;
     96      break;
     97    case ERROR_INVALID_NAME:
     98      prError = PR_INVALID_ARGUMENT_ERROR;
     99      break;
    100    case ERROR_INVALID_PARAMETER:
    101      prError = PR_INVALID_ARGUMENT_ERROR;
    102      break;
    103    case ERROR_INVALID_USER_BUFFER:
    104      prError = PR_INSUFFICIENT_RESOURCES_ERROR;
    105      break;
    106    case ERROR_LOCKED:
    107      prError = PR_FILE_IS_LOCKED_ERROR;
    108      break;
    109    case ERROR_NETNAME_DELETED:
    110      prError = PR_CONNECT_RESET_ERROR;
    111      break;
    112    case ERROR_NOACCESS:
    113      prError = PR_ACCESS_FAULT_ERROR;
    114      break;
    115    case ERROR_NOT_ENOUGH_MEMORY:
    116      prError = PR_INSUFFICIENT_RESOURCES_ERROR;
    117      break;
    118    case ERROR_NOT_ENOUGH_QUOTA:
    119      prError = PR_OUT_OF_MEMORY_ERROR;
    120      break;
    121    case ERROR_NOT_READY:
    122      prError = PR_IO_ERROR;
    123      break;
    124    case ERROR_NO_MORE_FILES:
    125      prError = PR_NO_MORE_FILES_ERROR;
    126      break;
    127    case ERROR_OPEN_FAILED:
    128      prError = PR_IO_ERROR;
    129      break;
    130    case ERROR_OPEN_FILES:
    131      prError = PR_IO_ERROR;
    132      break;
    133    case ERROR_OPERATION_ABORTED:
    134      prError = PR_OPERATION_ABORTED_ERROR;
    135      break;
    136    case ERROR_OUTOFMEMORY:
    137      prError = PR_INSUFFICIENT_RESOURCES_ERROR;
    138      break;
    139    case ERROR_PATH_BUSY:
    140      prError = PR_IO_ERROR;
    141      break;
    142    case ERROR_PATH_NOT_FOUND:
    143      prError = PR_FILE_NOT_FOUND_ERROR;
    144      break;
    145    case ERROR_SEEK_ON_DEVICE:
    146      prError = PR_IO_ERROR;
    147      break;
    148    case ERROR_SHARING_VIOLATION:
    149      prError = PR_FILE_IS_BUSY_ERROR;
    150      break;
    151    case ERROR_STACK_OVERFLOW:
    152      prError = PR_ACCESS_FAULT_ERROR;
    153      break;
    154    case ERROR_TOO_MANY_OPEN_FILES:
    155      prError = PR_SYS_DESC_TABLE_FULL_ERROR;
    156      break;
    157    case ERROR_WRITE_PROTECT:
    158      prError = PR_NO_ACCESS_RIGHTS_ERROR;
    159      break;
    160    case WSAEACCES:
    161      prError = PR_NO_ACCESS_RIGHTS_ERROR;
    162      break;
    163    case WSAEADDRINUSE:
    164      prError = PR_ADDRESS_IN_USE_ERROR;
    165      break;
    166    case WSAEADDRNOTAVAIL:
    167    case ERROR_INVALID_NETNAME:
    168      prError = PR_ADDRESS_NOT_AVAILABLE_ERROR;
    169      break;
    170    case WSAEAFNOSUPPORT:
    171    case ERROR_INCORRECT_ADDRESS:
    172      prError = PR_ADDRESS_NOT_SUPPORTED_ERROR;
    173      break;
    174    case WSAEALREADY:
    175    case ERROR_ALREADY_INITIALIZED:
    176      prError = PR_ALREADY_INITIATED_ERROR;
    177      break;
    178    case WSAEBADF:
    179      prError = PR_BAD_DESCRIPTOR_ERROR;
    180      break;
    181    case WSAECONNABORTED:
    182    case ERROR_CONNECTION_ABORTED:
    183      prError = PR_CONNECT_ABORTED_ERROR;
    184      break;
    185    case WSAECONNREFUSED:
    186    case ERROR_CONNECTION_REFUSED:
    187      prError = PR_CONNECT_REFUSED_ERROR;
    188      break;
    189    case WSAECONNRESET:
    190      prError = PR_CONNECT_RESET_ERROR;
    191      break;
    192    case WSAEDESTADDRREQ:
    193      prError = PR_INVALID_ARGUMENT_ERROR;
    194      break;
    195    case WSAEFAULT:
    196      prError = PR_ACCESS_FAULT_ERROR;
    197      break;
    198    case WSAEHOSTUNREACH:
    199    case ERROR_HOST_UNREACHABLE:
    200      prError = PR_HOST_UNREACHABLE_ERROR;
    201      break;
    202    case WSAEINVAL:
    203      prError = PR_INVALID_ARGUMENT_ERROR;
    204      break;
    205    case WSAEISCONN:
    206      prError = PR_IS_CONNECTED_ERROR;
    207      break;
    208    case WSAEMFILE:
    209      prError = PR_PROC_DESC_TABLE_FULL_ERROR;
    210      break;
    211    case WSAEMSGSIZE:
    212      prError = PR_BUFFER_OVERFLOW_ERROR;
    213      break;
    214    case WSAENETDOWN:
    215    case ERROR_NO_NETWORK:
    216      prError = PR_NETWORK_DOWN_ERROR;
    217      break;
    218    case WSAENETRESET:
    219      prError = PR_CONNECT_ABORTED_ERROR;
    220      break;
    221    case WSAENETUNREACH:
    222    case ERROR_NETWORK_UNREACHABLE:
    223      prError = PR_NETWORK_UNREACHABLE_ERROR;
    224      break;
    225    case WSAENOBUFS:
    226      prError = PR_INSUFFICIENT_RESOURCES_ERROR;
    227      break;
    228    case WSAENOPROTOOPT:
    229      prError = PR_INVALID_ARGUMENT_ERROR;
    230      break;
    231    case WSAENOTCONN:
    232      prError = PR_NOT_CONNECTED_ERROR;
    233      break;
    234    case WSAENOTSOCK:
    235      prError = PR_NOT_SOCKET_ERROR;
    236      break;
    237    case WSAEOPNOTSUPP:
    238      prError = PR_OPERATION_NOT_SUPPORTED_ERROR;
    239      break;
    240    case WSAEPROTONOSUPPORT:
    241      prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR;
    242      break;
    243    case WSAEPROTOTYPE:
    244      prError = PR_INVALID_ARGUMENT_ERROR;
    245      break;
    246    case WSAESHUTDOWN:
    247      prError = PR_SOCKET_SHUTDOWN_ERROR;
    248      break;
    249    case WSAESOCKTNOSUPPORT:
    250      prError = PR_INVALID_ARGUMENT_ERROR;
    251      break;
    252    case WSAETIMEDOUT:
    253      prError = PR_CONNECT_ABORTED_ERROR;
    254      break;
    255    case WSAEWOULDBLOCK:
    256      prError = PR_WOULD_BLOCK_ERROR;
    257      break;
    258    default:
    259      prError = PR_UNKNOWN_ERROR;
    260      break;
    261  }
    262  PR_SetError(prError, err);
    263 }
    264 
    265 void _MD_win32_map_opendir_error(PRInt32 err) {
    266  _MD_win32_map_default_error(err);
    267 }
    268 
    269 void _MD_win32_map_closedir_error(PRInt32 err) {
    270  _MD_win32_map_default_error(err);
    271 }
    272 
    273 void _MD_unix_readdir_error(PRInt32 err) { _MD_win32_map_default_error(err); }
    274 
    275 void _MD_win32_map_delete_error(PRInt32 err) {
    276  _MD_win32_map_default_error(err);
    277 }
    278 
    279 /* The error code for stat() is in errno. */
    280 void _MD_win32_map_stat_error(PRInt32 err) { _MD_win32_map_default_errno(err); }
    281 
    282 void _MD_win32_map_fstat_error(PRInt32 err) {
    283  _MD_win32_map_default_error(err);
    284 }
    285 
    286 void _MD_win32_map_rename_error(PRInt32 err) {
    287  _MD_win32_map_default_error(err);
    288 }
    289 
    290 /* The error code for access() is in errno. */
    291 void _MD_win32_map_access_error(PRInt32 err) {
    292  _MD_win32_map_default_errno(err);
    293 }
    294 
    295 void _MD_win32_map_mkdir_error(PRInt32 err) {
    296  _MD_win32_map_default_error(err);
    297 }
    298 
    299 void _MD_win32_map_rmdir_error(PRInt32 err) {
    300  _MD_win32_map_default_error(err);
    301 }
    302 
    303 void _MD_win32_map_read_error(PRInt32 err) { _MD_win32_map_default_error(err); }
    304 
    305 void _MD_win32_map_transmitfile_error(PRInt32 err) {
    306  _MD_win32_map_default_error(err);
    307 }
    308 
    309 void _MD_win32_map_write_error(PRInt32 err) {
    310  _MD_win32_map_default_error(err);
    311 }
    312 
    313 void _MD_win32_map_lseek_error(PRInt32 err) {
    314  _MD_win32_map_default_error(err);
    315 }
    316 
    317 void _MD_win32_map_fsync_error(PRInt32 err) {
    318  _MD_win32_map_default_error(err);
    319 }
    320 
    321 /*
    322 * For both CloseHandle() and closesocket().
    323 */
    324 void _MD_win32_map_close_error(PRInt32 err) {
    325  _MD_win32_map_default_error(err);
    326 }
    327 
    328 void _MD_win32_map_socket_error(PRInt32 err) {
    329  PR_ASSERT(err != WSANOTINITIALISED);
    330  _MD_win32_map_default_error(err);
    331 }
    332 
    333 void _MD_win32_map_recv_error(PRInt32 err) { _MD_win32_map_default_error(err); }
    334 
    335 void _MD_win32_map_recvfrom_error(PRInt32 err) {
    336  _MD_win32_map_default_error(err);
    337 }
    338 
    339 void _MD_win32_map_send_error(PRInt32 err) {
    340  PRErrorCode prError;
    341 
    342  switch (err) {
    343    case WSAEMSGSIZE:
    344      prError = PR_INVALID_ARGUMENT_ERROR;
    345      break;
    346    default:
    347      _MD_win32_map_default_error(err);
    348      return;
    349  }
    350  PR_SetError(prError, err);
    351 }
    352 
    353 void _MD_win32_map_sendto_error(PRInt32 err) {
    354  PRErrorCode prError;
    355 
    356  switch (err) {
    357    case WSAEMSGSIZE:
    358      prError = PR_INVALID_ARGUMENT_ERROR;
    359      break;
    360    default:
    361      _MD_win32_map_default_error(err);
    362      return;
    363  }
    364  PR_SetError(prError, err);
    365 }
    366 
    367 void _MD_win32_map_accept_error(PRInt32 err) {
    368  PRErrorCode prError;
    369 
    370  switch (err) {
    371    case WSAEOPNOTSUPP:
    372      prError = PR_NOT_TCP_SOCKET_ERROR;
    373      break;
    374    case WSAEINVAL:
    375      prError = PR_INVALID_STATE_ERROR;
    376      break;
    377    default:
    378      _MD_win32_map_default_error(err);
    379      return;
    380  }
    381  PR_SetError(prError, err);
    382 }
    383 
    384 void _MD_win32_map_acceptex_error(PRInt32 err) {
    385  _MD_win32_map_default_error(err);
    386 }
    387 
    388 void _MD_win32_map_connect_error(PRInt32 err) {
    389  PRErrorCode prError;
    390 
    391  switch (err) {
    392    case WSAEWOULDBLOCK:
    393      prError = PR_IN_PROGRESS_ERROR;
    394      break;
    395    case WSAEINVAL:
    396      prError = PR_ALREADY_INITIATED_ERROR;
    397      break;
    398    case WSAETIMEDOUT:
    399      prError = PR_IO_TIMEOUT_ERROR;
    400      break;
    401    default:
    402      _MD_win32_map_default_error(err);
    403      return;
    404  }
    405  PR_SetError(prError, err);
    406 }
    407 
    408 void _MD_win32_map_bind_error(PRInt32 err) {
    409  PRErrorCode prError;
    410 
    411  switch (err) {
    412    case WSAEINVAL:
    413      prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR;
    414      break;
    415    default:
    416      _MD_win32_map_default_error(err);
    417      return;
    418  }
    419  PR_SetError(prError, err);
    420 }
    421 
    422 void _MD_win32_map_listen_error(PRInt32 err) {
    423  PRErrorCode prError;
    424 
    425  switch (err) {
    426    case WSAEOPNOTSUPP:
    427      prError = PR_NOT_TCP_SOCKET_ERROR;
    428      break;
    429    case WSAEINVAL:
    430      prError = PR_INVALID_STATE_ERROR;
    431      break;
    432    default:
    433      _MD_win32_map_default_error(err);
    434      return;
    435  }
    436  PR_SetError(prError, err);
    437 }
    438 
    439 void _MD_win32_map_shutdown_error(PRInt32 err) {
    440  _MD_win32_map_default_error(err);
    441 }
    442 
    443 void _MD_win32_map_getsockname_error(PRInt32 err) {
    444  PRErrorCode prError;
    445 
    446  switch (err) {
    447    case WSAEINVAL:
    448      prError = PR_INVALID_STATE_ERROR;
    449      break;
    450    default:
    451      _MD_win32_map_default_error(err);
    452      return;
    453  }
    454  PR_SetError(prError, err);
    455 }
    456 
    457 void _MD_win32_map_getpeername_error(PRInt32 err) {
    458  _MD_win32_map_default_error(err);
    459 }
    460 
    461 void _MD_win32_map_getsockopt_error(PRInt32 err) {
    462  _MD_win32_map_default_error(err);
    463 }
    464 
    465 void _MD_win32_map_setsockopt_error(PRInt32 err) {
    466  _MD_win32_map_default_error(err);
    467 }
    468 
    469 void _MD_win32_map_open_error(PRInt32 err) { _MD_win32_map_default_error(err); }
    470 
    471 void _MD_win32_map_gethostname_error(PRInt32 err) {
    472  _MD_win32_map_default_error(err);
    473 }
    474 
    475 /* Win32 select() only works on sockets.  So in this
    476 ** context, WSAENOTSOCK is equivalent to EBADF on Unix.
    477 */
    478 void _MD_win32_map_select_error(PRInt32 err) {
    479  PRErrorCode prError;
    480 
    481  switch (err) {
    482    case WSAENOTSOCK:
    483      prError = PR_BAD_DESCRIPTOR_ERROR;
    484      break;
    485    default:
    486      _MD_win32_map_default_error(err);
    487      return;
    488  }
    489  PR_SetError(prError, err);
    490 }
    491 
    492 void _MD_win32_map_lockf_error(PRInt32 err) {
    493  _MD_win32_map_default_error(err);
    494 }