X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=e_os.h;h=9c0888e436e415c8a9804a31a904246a5cb22241;hp=3a4ba6dd1845ab4dca0c27b5fb313226604c61f2;hb=1f483a69bce11c940309edc437eee6e32294d5f2;hpb=a773b52a61bb269e75ebbac01cfca9ebcb6c78b9 diff --git a/e_os.h b/e_os.h index 3a4ba6dd18..9c0888e436 100644 --- a/e_os.h +++ b/e_os.h @@ -1,122 +1,56 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html */ #ifndef HEADER_E_OS_H # define HEADER_E_OS_H +# include # include # include +# include +# include "internal/nelem.h" + /* * contains what we can justify to make visible to the * outside; this file e_os.h is not part of the exported interface. */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Used to checking reference counts, most while doing perl5 stuff :-) */ -# if defined(OPENSSL_NO_STDIO) -# if defined(REF_DEBUG) -# error "REF_DEBUG requires stdio" -# endif -# if defined(REF_PRINT) -# error "REF_PRINT requires stdio" -# endif -# endif - -# if defined(REF_DEBUG) -# define REF_ASSERT_ISNT(test) \ - (void)((test) ? (OpenSSLDie(__FILE__, __LINE__, "refcount error"), 1) : 0) -# else -# define REF_ASSERT_ISNT(i) -# endif -# ifdef REF_PRINT -# define REF_PRINT_COUNT(a, b) \ - fprintf(stderr, "%p:%4d:%s\n", b, b->references, a) -# else -# define REF_PRINT_COUNT(a, b) -# endif - -# define osslargused(x) (void)x - # ifndef DEVRANDOM /* - * set this to a comma-separated list of 'random' device files to try out. My + * set this to a comma-separated list of 'random' device files to try out. By * default, we will try to read at least one of these files */ -# define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom" +# if defined(__s390__) +# define DEVRANDOM "/dev/prandom","/dev/urandom","/dev/hwrng","/dev/random" +# else +# define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom" +# endif # endif # if !defined(OPENSSL_NO_EGD) && !defined(DEVRANDOM_EGD) /* * set this to a comma-separated list of 'egd' sockets to try out. These * sockets will be tried in the order listed in case accessing the device - * files listed in DEVRANDOM did not return enough entropy. + * files listed in DEVRANDOM did not return enough randomness. */ # define DEVRANDOM_EGD "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy" # endif -# if defined(OPENSSL_SYS_VXWORKS) -# define NO_SYS_PARAM_H +# if defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI) # define NO_CHMOD # define NO_SYSLOG # endif +# define get_last_sys_error() errno +# define clear_sys_error() errno=0 +# define set_sys_error(e) errno=(e) + /******************************************************************** The Microsoft section ********************************************************************/ @@ -130,74 +64,17 @@ extern "C" { # define MSDOS # endif -# if (defined(MSDOS) || defined(OPENSSL_SYS_UEFI)) && !defined(GETPID_IS_MEANINGLESS) -# define GETPID_IS_MEANINGLESS -# endif - # ifdef WIN32 -# define NO_SYS_UN_H +# undef get_last_sys_error +# undef clear_sys_error +# undef set_sys_error # define get_last_sys_error() GetLastError() # define clear_sys_error() SetLastError(0) +# define set_sys_error(e) SetLastError(e) # if !defined(WINNT) # define WIN_CONSOLE_BUG # endif # else -# define get_last_sys_error() errno -# define clear_sys_error() errno=0 -# endif - -# if defined(WINDOWS) -# define get_last_socket_error() WSAGetLastError() -# define clear_socket_error() WSASetLastError(0) -# define readsocket(s,b,n) recv((s),(b),(n),0) -# define writesocket(s,b,n) send((s),(b),(n),0) -# elif defined(__DJGPP__) -# define WATT32 -# define get_last_socket_error() errno -# define clear_socket_error() errno=0 -# define closesocket(s) close_s(s) -# define readsocket(s,b,n) read_s(s,b,n) -# define writesocket(s,b,n) send(s,b,n,0) -# elif defined(OPENSSL_SYS_VMS) -# define get_last_socket_error() errno -# define clear_socket_error() errno=0 -# define ioctlsocket(a,b,c) ioctl(a,b,c) -# define closesocket(s) close(s) -# define readsocket(s,b,n) recv((s),(b),(n),0) -# define writesocket(s,b,n) send((s),(b),(n),0) -# elif defined(OPENSSL_SYS_VXWORKS) -# define get_last_socket_error() errno -# define clear_socket_error() errno=0 -# define ioctlsocket(a,b,c) ioctl((a),(b),(int)(c)) -# define closesocket(s) close(s) -# define readsocket(s,b,n) read((s),(b),(n)) -# define writesocket(s,b,n) write((s),(char *)(b),(n)) -# elif defined(OPENSSL_SYS_NETWARE) -# if defined(NETWARE_BSDSOCK) -# define get_last_socket_error() errno -# define clear_socket_error() errno=0 -# define closesocket(s) close(s) -# define ioctlsocket(a,b,c) ioctl(a,b,c) -# if defined(NETWARE_LIBC) -# define readsocket(s,b,n) recv((s),(b),(n),0) -# define writesocket(s,b,n) send((s),(b),(n),0) -# else -# define readsocket(s,b,n) recv((s),(char*)(b),(n),0) -# define writesocket(s,b,n) send((s),(char*)(b),(n),0) -# endif -# else -# define get_last_socket_error() WSAGetLastError() -# define clear_socket_error() WSASetLastError(0) -# define readsocket(s,b,n) recv((s),(b),(n),0) -# define writesocket(s,b,n) send((s),(b),(n),0) -# endif -# else -# define get_last_socket_error() errno -# define clear_socket_error() errno=0 -# define ioctlsocket(a,b,c) ioctl(a,b,c) -# define closesocket(s) close(s) -# define readsocket(s,b,n) read((s),(b),(n)) -# define writesocket(s,b,n) write((s),(b),(n)) # endif # if (defined(WINDOWS) || defined(MSDOS)) @@ -205,12 +82,11 @@ extern "C" { # ifdef __DJGPP__ # include # include -# include -# include -# include # define _setmode setmode # define _O_TEXT O_TEXT # define _O_BINARY O_BINARY +# define HAS_LFN_SUPPORT(name) (pathconf((name), _PC_NAME_MAX) > 12) +# undef DEVRANDOM_EGD /* Neither MS-DOS nor FreeDOS provide 'egd' sockets. */ # undef DEVRANDOM # define DEVRANDOM "/dev/urandom\x24" # endif /* __DJGPP__ */ @@ -226,7 +102,6 @@ extern "C" { # if !defined(WINNT) && !defined(__DJGPP__) # define NO_SYSLOG # endif -# define NO_DIRENT # ifdef WINDOWS # if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT) @@ -244,7 +119,7 @@ extern "C" { */ # define _WIN32_WINNT 0x0501 # endif -# if !defined(OPENSSL_NO_SOCK) && (defined(_WIN32_WINNT) || defined(_WIN32_WCE)) +# if defined(_WIN32_WINNT) || defined(_WIN32_WCE) /* * Just like defining _WIN32_WINNT including winsock2.h implies * certain "discipline" for maintaining [broad] binary compatibility. @@ -276,14 +151,6 @@ static __inline unsigned int _strlen31(const char *str) } # endif # include -# if defined(_MSC_VER) && _MSC_VER<=1200 && defined(_MT) && defined(isspace) - /* compensate for bug in VC6 ctype.h */ -# undef isspace -# undef isdigit -# undef isalnum -# undef isupper -# undef isxdigit -# endif # if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin) # if _MSC_VER>=1300 && _MSC_VER<1600 # undef stdin @@ -318,28 +185,14 @@ extern FILE *_imp___iob; # define OPENSSL_NO_POSIX_IO # endif -# if defined (__BORLANDC__) -# define _setmode setmode -# define _O_TEXT O_TEXT -# define _O_BINARY O_BINARY -# define _int64 __int64 -# define _kbhit kbhit -# endif - # define EXIT(n) exit(n) # define LIST_SEPARATOR_CHAR ';' -# ifndef X_OK -# define X_OK 0 -# endif # ifndef W_OK # define W_OK 2 # endif # ifndef R_OK # define R_OK 4 # endif -# define OPENSSL_CONF "openssl.cnf" -# define NUL_DEV "nul" -# define RFILE ".rnd" # ifdef OPENSSL_SYS_WINCE # define DEFAULT_HOME "" # else @@ -357,6 +210,12 @@ extern FILE *_imp___iob; # else /* The non-microsoft world */ +# if defined(OPENSSL_SYS_VXWORKS) +# include +# else +# include +# endif + # ifdef OPENSSL_SYS_VMS # define VMS 1 /* @@ -369,10 +228,7 @@ extern FILE *_imp___iob; # else # include # endif -# define OPENSSL_CONF "openssl.cnf" -# define RFILE ".rnd" # define LIST_SEPARATOR_CHAR ',' -# define NUL_DEV "NLA0:" /* We don't have any well-defined random devices on VMS, yet... */ # undef DEVRANDOM /*- @@ -392,7 +248,7 @@ extern FILE *_imp___iob; Finally, we add the VMS C facility code 0x35a000, because there are some programs, such as Perl, that will reinterpret the code back to something - POSIXly. 'man perlvms' explains it further. + POSIX. 'man perlvms' explains it further. NOTE: the perlvms manual wants to turn all codes 2 to 255 into success codes (status type = 1). I couldn't disagree more. Fortunately, the @@ -401,31 +257,7 @@ extern FILE *_imp___iob; */ # define EXIT(n) exit((n) ? (((n) << 3) | 2 | 0x10000000 | 0x35a000) : 1) -# define NO_SYS_PARAM_H -# define NO_SYS_UN_H - -# elif defined(OPENSSL_SYS_NETWARE) -# include -# include -# define NO_SYS_TYPES_H -# undef DEVRANDOM -# ifdef NETWARE_CLIB -# define getpid GetThreadID -extern int GetThreadID(void); -/* # include */ -extern int kbhit(void); -# else -# include -# endif -# define NO_SYSLOG -# define _setmode setmode -# define _kbhit kbhit -# define _O_TEXT O_TEXT -# define _O_BINARY O_BINARY -# define OPENSSL_CONF "openssl.cnf" -# define RFILE ".rnd" -# define LIST_SEPARATOR_CHAR ';' -# define EXIT(n) { if (n) printf("ERROR: %d\n", (int)n); exit(n); } +# define DEFAULT_HOME "SYS$LOGIN:" # else /* !defined VMS */ @@ -434,186 +266,16 @@ extern int kbhit(void); # else # include # endif -# ifndef NO_SYS_TYPES_H -# include -# endif +# include # ifdef OPENSSL_SYS_WIN32_CYGWIN # include # include # endif -# define OPENSSL_CONF "openssl.cnf" -# define RFILE ".rnd" # define LIST_SEPARATOR_CHAR ':' -# define NUL_DEV "/dev/null" # define EXIT(n) exit(n) # endif -# define OpenSSL_getpid() getpid() - -# endif - -/*************/ - -# if defined(OPENSSL_NO_SOCK) && !defined(OPENSSL_NO_DGRAM) -# define OPENSSL_NO_DGRAM -# endif - -# ifdef USE_SOCKETS -# if defined(WINDOWS) || defined(MSDOS) - /* windows world */ - -# ifdef OPENSSL_NO_SOCK -# define OpenSSL_Write(a,b,c) (-1) -# define OpenSSL_Read(a,b,c) (-1) -# define SHUTDOWN(fd) close(fd) -# define SHUTDOWN2(fd) close(fd) -# elif !defined(__DJGPP__) -# if defined(_WIN32_WCE) && _WIN32_WCE<410 -# define getservbyname _masked_declaration_getservbyname -# endif -# if !defined(IPPROTO_IP) - /* winsock[2].h was included already? */ -# include -# endif -# ifdef getservbyname -# undef getservbyname - /* this is used to be wcecompat/include/winsock_extras.h */ -struct servent *PASCAL getservbyname(const char *, const char *); -# endif - -# ifdef _WIN64 -/* - * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because - * the value constitutes an index in per-process table of limited size - * and not a real pointer. And we also depend on fact that all processors - * Windows run on happen to be two's-complement, which allows to - * interchange INVALID_SOCKET and -1. - */ -# define socket(d,t,p) ((int)socket(d,t,p)) -# define accept(s,f,l) ((int)accept(s,f,l)) -# endif -# define OpenSSL_Write(a,b,c) send((a),(b),(c),0) -# define OpenSSL_Read(a,b,c) recv((a),(b),(c),0) -# define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); } -# define SHUTDOWN2(fd) { shutdown((fd),2); closesocket(fd); } -# else -# define OpenSSL_Write(a,b,c) write_s(a,b,c,0) -# define OpenSSL_Read(a,b,c) read_s(a,b,c) -# define SHUTDOWN(fd) close_s(fd) -# define SHUTDOWN2(fd) close_s(fd) -# endif - -# elif defined(OPENSSL_SYS_NETWARE) - /* - * NetWare uses the WinSock2 interfaces by default, but can be - * configured for BSD - */ -# if defined(NETWARE_BSDSOCK) -# include -# include -# include -# include -# if defined(NETWARE_CLIB) -# include -# else -# include -# endif -# define INVALID_SOCKET (int)(~0) -# else -# include -# endif -# define OpenSSL_Write(a,b,c) send((a),(b),(c),0) -# define OpenSSL_Read(a,b,c) recv((a),(b),(c),0) -# define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); } -# define SHUTDOWN2(fd) { shutdown((fd),2); closesocket(fd); } - -# else - -# ifndef NO_SYS_PARAM_H -# include -# endif -# ifdef OPENSSL_SYS_VXWORKS -# include -# endif - -# include -# if defined(OPENSSL_SYS_VMS_NODECC) -# include -# include -# include -# else -# include -# ifndef NO_SYS_UN_H -# ifdef OPENSSL_SYS_VXWORKS -# include -# else -# include -# endif -# ifndef UNIX_PATH_MAX -# define UNIX_PATH_MAX sizeof(((struct sockaddr_un *)NULL)->sun_path) -# endif -# endif -# ifdef FILIO_H -# include /* FIONBIO in some SVR4, e.g. unixware, solaris */ -# endif -# include -# include -# include -# endif - -# ifdef OPENSSL_SYS_AIX -# include -# endif - -# ifdef __QNX__ -# include -# endif - -# ifndef VMS -# include -# else - /* ioctl is only in VMS > 7.0 and when socketshr is not used */ -# if !defined(TCPIP_TYPE_SOCKETSHR) && defined(__VMS_VER) && (__VMS_VER > 70000000) -# include -# endif -# endif - -# ifdef VMS -# include -# if defined(TCPIP_TYPE_SOCKETSHR) -# include -# endif -# endif - -# define OpenSSL_Read(a,b,c) read((a),(b),(c)) -# define OpenSSL_Write(a,b,c) write((a),(b),(c)) -# define SHUTDOWN(fd) { shutdown((fd),0); closesocket((fd)); } -# define SHUTDOWN2(fd) { shutdown((fd),2); closesocket((fd)); } -# ifndef INVALID_SOCKET -# define INVALID_SOCKET (-1) -# endif /* INVALID_SOCKET */ -# endif - -/* - * Some IPv6 implementations are broken, disable them in known bad versions. - */ -# if !defined(OPENSSL_USE_IPV6) -# if defined(AF_INET6) && !defined(NETWARE_CLIB) -# define OPENSSL_USE_IPV6 1 -# else -# define OPENSSL_USE_IPV6 0 -# endif -# endif - -# endif - -# ifndef OPENSSL_EXIT -# if defined(MONOLITH) && !defined(OPENSSL_C) -# define OPENSSL_EXIT(n) return(n) -# else -# define OPENSSL_EXIT(n) do { EXIT(n); return(n); } while(0) -# endif # endif /***********************************************/ @@ -621,27 +283,18 @@ struct servent *PASCAL getservbyname(const char *, const char *); # if defined(OPENSSL_SYS_WINDOWS) # define strcasecmp _stricmp # define strncasecmp _strnicmp -# elif defined(OPENSSL_SYS_VMS) -/* VMS below version 7.0 doesn't have strcasecmp() */ -# include "internal/o_str.h" -# define strcasecmp OPENSSL_strcasecmp -# define strncasecmp OPENSSL_strncasecmp -# define OPENSSL_IMPLEMENTS_strncasecmp -# elif defined(OPENSSL_SYS_OS2) && defined(__EMX__) -# define strcasecmp stricmp -# define strncasecmp strnicmp -# elif defined(OPENSSL_SYS_NETWARE) -# include -# if defined(NETWARE_CLIB) -# define strcasecmp stricmp -# define strncasecmp strnicmp -# endif /* NETWARE_CLIB */ -# endif - -# if defined(OPENSSL_SYS_OS2) && defined(__EMX__) -# include -# include -# define NO_SYSLOG +# if (_MSC_VER >= 1310) +# define open _open +# define fdopen _fdopen +# define close _close +# ifndef strdup +# define strdup _strdup +# endif +# define unlink _unlink +# define fileno _fileno +# endif +# else +# include # endif /* vxworks */ @@ -649,20 +302,16 @@ struct servent *PASCAL getservbyname(const char *, const char *); # include # include # include - -# define TTY_STRUCT int - -# define sleep(a) taskDelay((a) * sysClkRateGet()) - # include # include # include -# define getpid taskIdSelf +# define TTY_STRUCT int +# define sleep(a) taskDelay((a) * sysClkRateGet()) /* * NOTE: these are implemented by helpers in database app! if the database is - * not linked, we need to implement them elswhere + * not linked, we need to implement them elsewhere */ struct hostent *gethostbyname(const char *name); struct hostent *gethostbyaddr(const char *addr, int length, int type); @@ -671,10 +320,15 @@ struct servent *getservbyname(const char *name, const char *proto); # endif /* end vxworks */ -#define OSSL_NELEM(x) (sizeof(x)/sizeof(x[0])) - -#ifdef __cplusplus -} -#endif +# ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +# define CRYPTO_memcmp memcmp +# endif +/* unistd.h defines _POSIX_VERSION */ +# if !defined(OPENSSL_NO_SECURE_MEMORY) && defined(OPENSSL_SYS_UNIX) \ + && ( (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L) \ + || defined(__sun) || defined(__hpux) || defined(__sgi) \ + || defined(__osf__) ) +# define OPENSSL_SECURE_MEMORY /* secure memory is implemented */ +# endif #endif