1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ssl/win32err.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,343 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* 1.6 + * This file essentially replicates NSPR's source for the functions that 1.7 + * map system-specific error codes to NSPR error codes. We would use 1.8 + * NSPR's functions, instead of duplicating them, but they're private. 1.9 + * As long as SSL's server session cache code must do platform native I/O 1.10 + * to accomplish its job, and NSPR's error mapping functions remain private, 1.11 + * this code will continue to need to be replicated. 1.12 + * 1.13 + * This Source Code Form is subject to the terms of the Mozilla Public 1.14 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.15 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.16 + 1.17 +#include "prerror.h" 1.18 +#include "prlog.h" 1.19 +#include <errno.h> 1.20 +#include <windows.h> 1.21 + 1.22 +/* 1.23 + * On Win32, we map three kinds of error codes: 1.24 + * - GetLastError(): for Win32 functions 1.25 + * - WSAGetLastError(): for Winsock functions 1.26 + * - errno: for standard C library functions 1.27 + * 1.28 + * We do not check for WSAEINPROGRESS and WSAEINTR because we do not 1.29 + * use blocking Winsock 1.1 calls. 1.30 + * 1.31 + * Except for the 'socket' call, we do not check for WSAEINITIALISED. 1.32 + * It is assumed that if Winsock is not initialized, that fact will 1.33 + * be detected at the time we create new sockets. 1.34 + */ 1.35 + 1.36 +/* forward declaration. */ 1.37 +void nss_MD_win32_map_default_error(PRInt32 err); 1.38 + 1.39 +void nss_MD_win32_map_opendir_error(PRInt32 err) 1.40 +{ 1.41 + nss_MD_win32_map_default_error(err); 1.42 +} 1.43 + 1.44 +void nss_MD_win32_map_closedir_error(PRInt32 err) 1.45 +{ 1.46 + nss_MD_win32_map_default_error(err); 1.47 +} 1.48 + 1.49 +void nss_MD_win32_map_readdir_error(PRInt32 err) 1.50 +{ 1.51 + nss_MD_win32_map_default_error(err); 1.52 +} 1.53 + 1.54 +void nss_MD_win32_map_delete_error(PRInt32 err) 1.55 +{ 1.56 + nss_MD_win32_map_default_error(err); 1.57 +} 1.58 + 1.59 +/* The error code for stat() is in errno. */ 1.60 +void nss_MD_win32_map_stat_error(PRInt32 err) 1.61 +{ 1.62 + nss_MD_win32_map_default_error(err); 1.63 +} 1.64 + 1.65 +void nss_MD_win32_map_fstat_error(PRInt32 err) 1.66 +{ 1.67 + nss_MD_win32_map_default_error(err); 1.68 +} 1.69 + 1.70 +void nss_MD_win32_map_rename_error(PRInt32 err) 1.71 +{ 1.72 + nss_MD_win32_map_default_error(err); 1.73 +} 1.74 + 1.75 +/* The error code for access() is in errno. */ 1.76 +void nss_MD_win32_map_access_error(PRInt32 err) 1.77 +{ 1.78 + nss_MD_win32_map_default_error(err); 1.79 +} 1.80 + 1.81 +void nss_MD_win32_map_mkdir_error(PRInt32 err) 1.82 +{ 1.83 + nss_MD_win32_map_default_error(err); 1.84 +} 1.85 + 1.86 +void nss_MD_win32_map_rmdir_error(PRInt32 err) 1.87 +{ 1.88 + nss_MD_win32_map_default_error(err); 1.89 +} 1.90 + 1.91 +void nss_MD_win32_map_read_error(PRInt32 err) 1.92 +{ 1.93 + nss_MD_win32_map_default_error(err); 1.94 +} 1.95 + 1.96 +void nss_MD_win32_map_transmitfile_error(PRInt32 err) 1.97 +{ 1.98 + nss_MD_win32_map_default_error(err); 1.99 +} 1.100 + 1.101 +void nss_MD_win32_map_write_error(PRInt32 err) 1.102 +{ 1.103 + nss_MD_win32_map_default_error(err); 1.104 +} 1.105 + 1.106 +void nss_MD_win32_map_lseek_error(PRInt32 err) 1.107 +{ 1.108 + nss_MD_win32_map_default_error(err); 1.109 +} 1.110 + 1.111 +void nss_MD_win32_map_fsync_error(PRInt32 err) 1.112 +{ 1.113 + nss_MD_win32_map_default_error(err); 1.114 +} 1.115 + 1.116 +/* 1.117 + * For both CloseHandle() and closesocket(). 1.118 + */ 1.119 +void nss_MD_win32_map_close_error(PRInt32 err) 1.120 +{ 1.121 + nss_MD_win32_map_default_error(err); 1.122 +} 1.123 + 1.124 +void nss_MD_win32_map_socket_error(PRInt32 err) 1.125 +{ 1.126 + PR_ASSERT(err != WSANOTINITIALISED); 1.127 + nss_MD_win32_map_default_error(err); 1.128 +} 1.129 + 1.130 +void nss_MD_win32_map_recv_error(PRInt32 err) 1.131 +{ 1.132 + nss_MD_win32_map_default_error(err); 1.133 +} 1.134 + 1.135 +void nss_MD_win32_map_recvfrom_error(PRInt32 err) 1.136 +{ 1.137 + nss_MD_win32_map_default_error(err); 1.138 +} 1.139 + 1.140 +void nss_MD_win32_map_send_error(PRInt32 err) 1.141 +{ 1.142 + PRErrorCode prError; 1.143 + switch (err) { 1.144 + case WSAEMSGSIZE: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.145 + default: nss_MD_win32_map_default_error(err); return; 1.146 + } 1.147 + PR_SetError(prError, err); 1.148 +} 1.149 + 1.150 +void nss_MD_win32_map_sendto_error(PRInt32 err) 1.151 +{ 1.152 + PRErrorCode prError; 1.153 + switch (err) { 1.154 + case WSAEMSGSIZE: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.155 + default: nss_MD_win32_map_default_error(err); return; 1.156 + } 1.157 + PR_SetError(prError, err); 1.158 +} 1.159 + 1.160 +void nss_MD_win32_map_accept_error(PRInt32 err) 1.161 +{ 1.162 + PRErrorCode prError; 1.163 + switch (err) { 1.164 + case WSAEOPNOTSUPP: prError = PR_NOT_TCP_SOCKET_ERROR; break; 1.165 + case WSAEINVAL: prError = PR_INVALID_STATE_ERROR; break; 1.166 + default: nss_MD_win32_map_default_error(err); return; 1.167 + } 1.168 + PR_SetError(prError, err); 1.169 +} 1.170 + 1.171 +void nss_MD_win32_map_acceptex_error(PRInt32 err) 1.172 +{ 1.173 + nss_MD_win32_map_default_error(err); 1.174 +} 1.175 + 1.176 +void nss_MD_win32_map_connect_error(PRInt32 err) 1.177 +{ 1.178 + PRErrorCode prError; 1.179 + switch (err) { 1.180 + case WSAEWOULDBLOCK: prError = PR_IN_PROGRESS_ERROR; break; 1.181 + case WSAEINVAL: prError = PR_ALREADY_INITIATED_ERROR; break; 1.182 + case WSAETIMEDOUT: prError = PR_IO_TIMEOUT_ERROR; break; 1.183 + default: nss_MD_win32_map_default_error(err); return; 1.184 + } 1.185 + PR_SetError(prError, err); 1.186 +} 1.187 + 1.188 +void nss_MD_win32_map_bind_error(PRInt32 err) 1.189 +{ 1.190 + PRErrorCode prError; 1.191 + switch (err) { 1.192 + case WSAEINVAL: prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR; break; 1.193 + default: nss_MD_win32_map_default_error(err); return; 1.194 + } 1.195 + PR_SetError(prError, err); 1.196 +} 1.197 + 1.198 +void nss_MD_win32_map_listen_error(PRInt32 err) 1.199 +{ 1.200 + PRErrorCode prError; 1.201 + switch (err) { 1.202 + case WSAEOPNOTSUPP: prError = PR_NOT_TCP_SOCKET_ERROR; break; 1.203 + case WSAEINVAL: prError = PR_INVALID_STATE_ERROR; break; 1.204 + default: nss_MD_win32_map_default_error(err); return; 1.205 + } 1.206 + PR_SetError(prError, err); 1.207 +} 1.208 + 1.209 +void nss_MD_win32_map_shutdown_error(PRInt32 err) 1.210 +{ 1.211 + nss_MD_win32_map_default_error(err); 1.212 +} 1.213 + 1.214 +void nss_MD_win32_map_getsockname_error(PRInt32 err) 1.215 +{ 1.216 + PRErrorCode prError; 1.217 + switch (err) { 1.218 + case WSAEINVAL: prError = PR_INVALID_STATE_ERROR; break; 1.219 + default: nss_MD_win32_map_default_error(err); return; 1.220 + } 1.221 + PR_SetError(prError, err); 1.222 +} 1.223 + 1.224 +void nss_MD_win32_map_getpeername_error(PRInt32 err) 1.225 +{ 1.226 + nss_MD_win32_map_default_error(err); 1.227 +} 1.228 + 1.229 +void nss_MD_win32_map_getsockopt_error(PRInt32 err) 1.230 +{ 1.231 + nss_MD_win32_map_default_error(err); 1.232 +} 1.233 + 1.234 +void nss_MD_win32_map_setsockopt_error(PRInt32 err) 1.235 +{ 1.236 + nss_MD_win32_map_default_error(err); 1.237 +} 1.238 + 1.239 +void nss_MD_win32_map_open_error(PRInt32 err) 1.240 +{ 1.241 + nss_MD_win32_map_default_error(err); 1.242 +} 1.243 + 1.244 +void nss_MD_win32_map_gethostname_error(PRInt32 err) 1.245 +{ 1.246 + nss_MD_win32_map_default_error(err); 1.247 +} 1.248 + 1.249 +/* Win32 select() only works on sockets. So in this 1.250 +** context, WSAENOTSOCK is equivalent to EBADF on Unix. 1.251 +*/ 1.252 +void nss_MD_win32_map_select_error(PRInt32 err) 1.253 +{ 1.254 + PRErrorCode prError; 1.255 + switch (err) { 1.256 + case WSAENOTSOCK: prError = PR_BAD_DESCRIPTOR_ERROR; break; 1.257 + default: nss_MD_win32_map_default_error(err); return; 1.258 + } 1.259 + PR_SetError(prError, err); 1.260 +} 1.261 + 1.262 +void nss_MD_win32_map_lockf_error(PRInt32 err) 1.263 +{ 1.264 + nss_MD_win32_map_default_error(err); 1.265 +} 1.266 + 1.267 + 1.268 + 1.269 +void nss_MD_win32_map_default_error(PRInt32 err) 1.270 +{ 1.271 + PRErrorCode prError; 1.272 + 1.273 + switch (err) { 1.274 + case EACCES: prError = PR_NO_ACCESS_RIGHTS_ERROR; break; 1.275 + case ENOENT: prError = PR_FILE_NOT_FOUND_ERROR; break; 1.276 + case ERROR_ACCESS_DENIED: prError = PR_NO_ACCESS_RIGHTS_ERROR; break; 1.277 + case ERROR_ALREADY_EXISTS: prError = PR_FILE_EXISTS_ERROR; break; 1.278 + case ERROR_DISK_CORRUPT: prError = PR_IO_ERROR; break; 1.279 + case ERROR_DISK_FULL: prError = PR_NO_DEVICE_SPACE_ERROR; break; 1.280 + case ERROR_DISK_OPERATION_FAILED: prError = PR_IO_ERROR; break; 1.281 + case ERROR_DRIVE_LOCKED: prError = PR_FILE_IS_LOCKED_ERROR; break; 1.282 + case ERROR_FILENAME_EXCED_RANGE: prError = PR_NAME_TOO_LONG_ERROR; break; 1.283 + case ERROR_FILE_CORRUPT: prError = PR_IO_ERROR; break; 1.284 + case ERROR_FILE_EXISTS: prError = PR_FILE_EXISTS_ERROR; break; 1.285 + case ERROR_FILE_INVALID: prError = PR_BAD_DESCRIPTOR_ERROR; break; 1.286 +#if ERROR_FILE_NOT_FOUND != ENOENT 1.287 + case ERROR_FILE_NOT_FOUND: prError = PR_FILE_NOT_FOUND_ERROR; break; 1.288 +#endif 1.289 + case ERROR_HANDLE_DISK_FULL: prError = PR_NO_DEVICE_SPACE_ERROR; break; 1.290 + case ERROR_INVALID_ADDRESS: prError = PR_ACCESS_FAULT_ERROR; break; 1.291 + case ERROR_INVALID_HANDLE: prError = PR_BAD_DESCRIPTOR_ERROR; break; 1.292 + case ERROR_INVALID_NAME: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.293 + case ERROR_INVALID_PARAMETER: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.294 + case ERROR_INVALID_USER_BUFFER: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.295 + case ERROR_LOCKED: prError = PR_FILE_IS_LOCKED_ERROR; break; 1.296 + case ERROR_NETNAME_DELETED: prError = PR_CONNECT_RESET_ERROR; break; 1.297 + case ERROR_NOACCESS: prError = PR_ACCESS_FAULT_ERROR; break; 1.298 + case ERROR_NOT_ENOUGH_MEMORY: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.299 + case ERROR_NOT_ENOUGH_QUOTA: prError = PR_OUT_OF_MEMORY_ERROR; break; 1.300 + case ERROR_NOT_READY: prError = PR_IO_ERROR; break; 1.301 + case ERROR_NO_MORE_FILES: prError = PR_NO_MORE_FILES_ERROR; break; 1.302 + case ERROR_OPEN_FAILED: prError = PR_IO_ERROR; break; 1.303 + case ERROR_OPEN_FILES: prError = PR_IO_ERROR; break; 1.304 + case ERROR_OUTOFMEMORY: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.305 + case ERROR_PATH_BUSY: prError = PR_IO_ERROR; break; 1.306 + case ERROR_PATH_NOT_FOUND: prError = PR_FILE_NOT_FOUND_ERROR; break; 1.307 + case ERROR_SEEK_ON_DEVICE: prError = PR_IO_ERROR; break; 1.308 + case ERROR_SHARING_VIOLATION: prError = PR_FILE_IS_BUSY_ERROR; break; 1.309 + case ERROR_STACK_OVERFLOW: prError = PR_ACCESS_FAULT_ERROR; break; 1.310 + case ERROR_TOO_MANY_OPEN_FILES: prError = PR_SYS_DESC_TABLE_FULL_ERROR; break; 1.311 + case ERROR_WRITE_PROTECT: prError = PR_NO_ACCESS_RIGHTS_ERROR; break; 1.312 + case WSAEACCES: prError = PR_NO_ACCESS_RIGHTS_ERROR; break; 1.313 + case WSAEADDRINUSE: prError = PR_ADDRESS_IN_USE_ERROR; break; 1.314 + case WSAEADDRNOTAVAIL: prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; break; 1.315 + case WSAEAFNOSUPPORT: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.316 + case WSAEALREADY: prError = PR_ALREADY_INITIATED_ERROR; break; 1.317 + case WSAEBADF: prError = PR_BAD_DESCRIPTOR_ERROR; break; 1.318 + case WSAECONNABORTED: prError = PR_CONNECT_ABORTED_ERROR; break; 1.319 + case WSAECONNREFUSED: prError = PR_CONNECT_REFUSED_ERROR; break; 1.320 + case WSAECONNRESET: prError = PR_CONNECT_RESET_ERROR; break; 1.321 + case WSAEDESTADDRREQ: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.322 + case WSAEFAULT: prError = PR_ACCESS_FAULT_ERROR; break; 1.323 + case WSAEHOSTUNREACH: prError = PR_HOST_UNREACHABLE_ERROR; break; 1.324 + case WSAEINVAL: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.325 + case WSAEISCONN: prError = PR_IS_CONNECTED_ERROR; break; 1.326 + case WSAEMFILE: prError = PR_PROC_DESC_TABLE_FULL_ERROR; break; 1.327 + case WSAEMSGSIZE: prError = PR_BUFFER_OVERFLOW_ERROR; break; 1.328 + case WSAENETDOWN: prError = PR_NETWORK_DOWN_ERROR; break; 1.329 + case WSAENETRESET: prError = PR_CONNECT_ABORTED_ERROR; break; 1.330 + case WSAENETUNREACH: prError = PR_NETWORK_UNREACHABLE_ERROR; break; 1.331 + case WSAENOBUFS: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.332 + case WSAENOPROTOOPT: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.333 + case WSAENOTCONN: prError = PR_NOT_CONNECTED_ERROR; break; 1.334 + case WSAENOTSOCK: prError = PR_NOT_SOCKET_ERROR; break; 1.335 + case WSAEOPNOTSUPP: prError = PR_OPERATION_NOT_SUPPORTED_ERROR; break; 1.336 + case WSAEPROTONOSUPPORT: prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR; break; 1.337 + case WSAEPROTOTYPE: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.338 + case WSAESHUTDOWN: prError = PR_SOCKET_SHUTDOWN_ERROR; break; 1.339 + case WSAESOCKTNOSUPPORT: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.340 + case WSAETIMEDOUT: prError = PR_CONNECT_ABORTED_ERROR; break; 1.341 + case WSAEWOULDBLOCK: prError = PR_WOULD_BLOCK_ERROR; break; 1.342 + default: prError = PR_UNKNOWN_ERROR; break; 1.343 + } 1.344 + PR_SetError(prError, err); 1.345 +} 1.346 +