]> git.ipfire.org Git - thirdparty/openssl.git/blame - e_os.h
Clear secret stack values after use in curve25519.c
[thirdparty/openssl.git] / e_os.h
CommitLineData
b6cff313 1/*
b99fe5f4 2 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
0f113f3e 3 *
b6cff313
RS
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
d02b48c6
RE
8 */
9
10#ifndef HEADER_E_OS_H
0f113f3e 11# define HEADER_E_OS_H
d02b48c6 12
0f113f3e 13# include <openssl/opensslconf.h>
06018c46 14
0f113f3e 15# include <openssl/e_os2.h>
98d132cf 16# include <openssl/crypto.h>
176db6dc 17# include "internal/nelem.h"
b99fe5f4 18
0f113f3e
MC
19/*
20 * <openssl/e_os2.h> contains what we can justify to make visible to the
21 * outside; this file e_os.h is not part of the exported interface.
22 */
fa470a84 23
d02b48c6
RE
24#ifdef __cplusplus
25extern "C" {
26#endif
27
58964a49 28/* Used to checking reference counts, most while doing perl5 stuff :-) */
f3f1cf84 29# if defined(OPENSSL_NO_STDIO)
f3f1cf84
RS
30# if defined(REF_PRINT)
31# error "REF_PRINT requires stdio"
32# endif
0f113f3e 33# endif
f3f1cf84 34
43708c15 35/*
5f584013
AP
36 * Format specifier for printing size_t. Original conundrum was to
37 * get it working with -Wformat [-Werror], which can be considered
a303e9a6 38 * overzealous, especially in multi-platform context, but it's
5f584013 39 * conscious choice...
43708c15 40 */
5f584013
AP
41# if defined(_WIN64)
42# define OSSLzu "I64u" /* One would expect _WIN{64|32} cases after
43 * __STDC_VERSION__, but there are corner
44 * cases of MinGW compilers that link with
45 * non-compliant MSVCRT.DLL... */
46# elif defined(_WIN32)
47# define OSSLzu "u"
48# elif defined(__VMS)
49# define OSSLzu "u" /* VMS suffers from similar problem as MinGW,
50 * i.e. C RTL falling behind compiler. Recall
51 * that sizeof(size_t)==4 even in LP64 case. */
52# elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
43708c15 53# define OSSLzu "zu"
5f584013
AP
54# elif defined(__SIZEOF_SIZE_T__) && __SIZEOF_SIZE_T__==4
55# define OSSLzu "u" /* 'lu' should have worked, but when generating
56 * 32-bit code gcc still complains :-( */
43708c15 57# else
5f584013
AP
58# define OSSLzu "lu" /* To see that is works recall what does L
59 * stand for in ILP32 and LP64 */
43708c15
RS
60# endif
61
463a7b8c 62# if !defined(NDEBUG) && !defined(OPENSSL_NO_STDIO)
f3f1cf84 63# define REF_ASSERT_ISNT(test) \
040d43b3 64 (void)((test) ? (OPENSSL_die("refcount error", __FILE__, __LINE__), 1) : 0)
f3f1cf84
RS
65# else
66# define REF_ASSERT_ISNT(i)
984d6c60 67# endif
f3f1cf84
RS
68# ifdef REF_PRINT
69# define REF_PRINT_COUNT(a, b) \
70 fprintf(stderr, "%p:%4d:%s\n", b, b->references, a)
71# else
72# define REF_PRINT_COUNT(a, b)
984d6c60 73# endif
58964a49 74
040d43b3 75# define OPENSSL_CONF "openssl.cnf"
a773b52a 76
0f113f3e
MC
77# ifndef DEVRANDOM
78/*
f367ac2b 79 * set this to a comma-separated list of 'random' device files to try out. By
0f113f3e
MC
80 * default, we will try to read at least one of these files
81 */
82# define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom"
83# endif
0423f812 84# if !defined(OPENSSL_NO_EGD) && !defined(DEVRANDOM_EGD)
0f113f3e
MC
85/*
86 * set this to a comma-separated list of 'egd' sockets to try out. These
87 * sockets will be tried in the order listed in case accessing the device
f367ac2b 88 * files listed in DEVRANDOM did not return enough randomness.
0f113f3e
MC
89 */
90# define DEVRANDOM_EGD "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy"
91# endif
d02b48c6 92
cff55b90 93# if defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI)
3e83e686
RL
94# define NO_SYS_PARAM_H
95# define NO_CHMOD
96# define NO_SYSLOG
0f113f3e
MC
97# endif
98
0e97f1e1
RS
99# define get_last_sys_error() errno
100# define clear_sys_error() errno=0
101
d02b48c6
RE
102/********************************************************************
103 The Microsoft section
104 ********************************************************************/
0f113f3e 105# if defined(OPENSSL_SYS_WIN32) && !defined(WIN32)
b8384651 106# define WIN32
0f113f3e
MC
107# endif
108# if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS)
cf1b7d96 109# define WINDOWS
0f113f3e
MC
110# endif
111# if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS)
cf1b7d96 112# define MSDOS
0f113f3e 113# endif
d02b48c6 114
0f113f3e
MC
115# ifdef WIN32
116# define NO_SYS_UN_H
0e97f1e1
RS
117# undef get_last_sys_error
118# undef clear_sys_error
0f113f3e
MC
119# define get_last_sys_error() GetLastError()
120# define clear_sys_error() SetLastError(0)
121# if !defined(WINNT)
122# define WIN_CONSOLE_BUG
123# endif
124# else
0f113f3e 125# endif
58964a49 126
0f113f3e 127# if (defined(WINDOWS) || defined(MSDOS))
d02b48c6 128
f642ebc1 129# ifdef __DJGPP__
0f113f3e
MC
130# include <unistd.h>
131# include <sys/stat.h>
132# include <sys/socket.h>
2c25ebd1 133# include <sys/un.h>
0f113f3e
MC
134# include <tcp.h>
135# include <netdb.h>
136# define _setmode setmode
137# define _O_TEXT O_TEXT
138# define _O_BINARY O_BINARY
2c25ebd1
RL
139# define HAS_LFN_SUPPORT(name) (pathconf((name), _PC_NAME_MAX) > 12)
140# undef DEVRANDOM_EGD /* Neither MS-DOS nor FreeDOS provide 'egd' sockets. */
0f113f3e
MC
141# undef DEVRANDOM
142# define DEVRANDOM "/dev/urandom\x24"
143# endif /* __DJGPP__ */
f642ebc1 144
0056ef5d 145# ifndef S_IFDIR
0f113f3e 146# define S_IFDIR _S_IFDIR
0056ef5d 147# endif
6e064240 148
0056ef5d 149# ifndef S_IFMT
0f113f3e 150# define S_IFMT _S_IFMT
0056ef5d 151# endif
6e064240 152
f642ebc1 153# if !defined(WINNT) && !defined(__DJGPP__)
0f113f3e 154# define NO_SYSLOG
0056ef5d
RL
155# endif
156# define NO_DIRENT
d02b48c6 157
d02b48c6 158# ifdef WINDOWS
0f113f3e 159# if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT)
e476f942 160 /*
0f113f3e
MC
161 * Defining _WIN32_WINNT here in e_os.h implies certain "discipline."
162 * Most notably we ought to check for availability of each specific
0ee05b73
AP
163 * routine that was introduced after denoted _WIN32_WINNT with
164 * GetProcAddress(). Normally newer functions are masked with higher
165 * _WIN32_WINNT in SDK headers. So that if you wish to use them in
166 * some module, you'd need to override _WIN32_WINNT definition in
167 * the target module in order to "reach for" prototypes, but replace
168 * calls to new functions with indirect calls. Alternatively it
169 * might be possible to achieve the goal by /DELAYLOAD-ing .DLLs
170 * and check for current OS version instead.
0f113f3e 171 */
0ee05b73 172# define _WIN32_WINNT 0x0501
0f113f3e 173# endif
2469e76b 174# if defined(_WIN32_WINNT) || defined(_WIN32_WCE)
61aa2134
AP
175 /*
176 * Just like defining _WIN32_WINNT including winsock2.h implies
8711efb4 177 * certain "discipline" for maintaining [broad] binary compatibility.
61aa2134
AP
178 * As long as structures are invariant among Winsock versions,
179 * it's sufficient to check for specific Winsock2 API availability
180 * at run-time [DSO_global_lookup is recommended]...
181 */
0f113f3e
MC
182# include <winsock2.h>
183# include <ws2tcpip.h>
8711efb4 184 /* yes, they have to be #included prior to <windows.h> */
0f113f3e
MC
185# endif
186# include <windows.h>
187# include <stdio.h>
188# include <stddef.h>
189# include <errno.h>
190# if defined(_WIN32_WCE) && !defined(EACCES)
191# define EACCES 13
192# endif
193# include <string.h>
194# ifdef _WIN64
195# define strlen(s) _strlen31(s)
1875e6db 196/* cut strings to 2GB */
55c7a4cf 197static __inline unsigned int _strlen31(const char *str)
0f113f3e
MC
198{
199 unsigned int len = 0;
200 while (*str && len < 0x80000000U)
201 str++, len++;
202 return len & 0x7FFFFFFF;
203}
204# endif
205# include <malloc.h>
206# if defined(_MSC_VER) && _MSC_VER<=1200 && defined(_MT) && defined(isspace)
e527201f 207 /* compensate for bug in VC6 ctype.h */
0f113f3e
MC
208# undef isspace
209# undef isdigit
210# undef isalnum
211# undef isupper
212# undef isxdigit
213# endif
214# if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin)
215# if _MSC_VER>=1300 && _MSC_VER<1600
216# undef stdin
217# undef stdout
218# undef stderr
219FILE *__iob_func();
220# define stdin (&__iob_func()[0])
221# define stdout (&__iob_func()[1])
222# define stderr (&__iob_func()[2])
223# elif _MSC_VER<1300 && defined(I_CAN_LIVE_WITH_LNK4049)
224# undef stdin
225# undef stdout
226# undef stderr
227 /*
228 * pre-1300 has __p__iob(), but it's available only in msvcrt.lib,
229 * or in other words with /MD. Declaring implicit import, i.e. with
230 * _imp_ prefix, works correctly with all compiler options, but
231 * without /MD results in LINK warning LNK4049: 'locally defined
232 * symbol "__iob" imported'.
e527201f 233 */
0f113f3e
MC
234extern FILE *_imp___iob;
235# define stdin (&_imp___iob[0])
236# define stdout (&_imp___iob[1])
237# define stderr (&_imp___iob[2])
e527201f 238# endif
0f113f3e 239# endif
d02b48c6 240# endif
0f113f3e
MC
241# include <io.h>
242# include <fcntl.h>
d02b48c6 243
0bf23d9b 244# ifdef OPENSSL_SYS_WINCE
0f113f3e 245# define OPENSSL_NO_POSIX_IO
0bf23d9b
RL
246# endif
247
be7b4458 248# define EXIT(n) exit(n)
d02b48c6 249# define LIST_SEPARATOR_CHAR ';'
0056ef5d 250# ifndef W_OK
0f113f3e 251# define W_OK 2
0056ef5d
RL
252# endif
253# ifndef R_OK
0f113f3e 254# define R_OK 4
0056ef5d 255# endif
0bf23d9b 256# ifdef OPENSSL_SYS_WINCE
0f113f3e 257# define DEFAULT_HOME ""
0bf23d9b 258# else
0f113f3e 259# define DEFAULT_HOME "C:"
0bf23d9b 260# endif
d02b48c6 261
86d21d0b 262/* Avoid Visual Studio 13 GetVersion deprecated problems */
0f113f3e
MC
263# if defined(_MSC_VER) && _MSC_VER>=1800
264# define check_winnt() (1)
265# define check_win_minplat(x) (1)
266# else
267# define check_winnt() (GetVersion() < 0x80000000)
268# define check_win_minplat(x) (LOBYTE(LOWORD(GetVersion())) >= (x))
269# endif
f511b25a 270
0f113f3e 271# else /* The non-microsoft world */
d02b48c6 272
cf1b7d96 273# ifdef OPENSSL_SYS_VMS
0f113f3e
MC
274# define VMS 1
275 /*
276 * some programs don't include stdlib, so exit() and others give implicit
277 * function warnings
278 */
279# include <stdlib.h>
280# if defined(__DECC)
281# include <unistd.h>
282# else
283# include <unixlib.h>
284# endif
0f113f3e 285# define LIST_SEPARATOR_CHAR ','
0c61e299 286 /* We don't have any well-defined random devices on VMS, yet... */
0f113f3e 287# undef DEVRANDOM
1d97c843
TH
288 /*-
289 We need to do this since VMS has the following coding on status codes:
511e596b
RL
290
291 Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ...
292 The important thing to know is that odd numbers are considered
0f113f3e 293 good, while even ones are considered errors.
511e596b
RL
294 Bits 3-15: actual status number
295 Bits 16-27: facility number. 0 is considered "unknown"
296 Bits 28-31: control bits. If bit 28 is set, the shell won't try to
297 output the message (which, for random codes, just looks ugly)
298
299 So, what we do here is to change 0 to 1 to get the default success status,
300 and everything else is shifted up to fit into the status number field, and
f625d383 301 the status is tagged as an error, which is what is wanted here.
c3944a99
RL
302
303 Finally, we add the VMS C facility code 0x35a000, because there are some
304 programs, such as Perl, that will reinterpret the code back to something
305 POSIXly. 'man perlvms' explains it further.
f625d383 306
c3944a99
RL
307 NOTE: the perlvms manual wants to turn all codes 2 to 255 into success
308 codes (status type = 1). I couldn't disagree more. Fortunately, the
309 status type doesn't seem to bother Perl.
511e596b
RL
310 -- Richard Levitte
311 */
f625d383
RL
312# define EXIT(n) exit((n) ? (((n) << 3) | 2 | 0x10000000 | 0x35a000) : 1)
313
0f113f3e 314# define NO_SYS_PARAM_H
c168a027 315# define NO_SYS_UN_H
4d8743f4 316
b8f304f7
RL
317# define DEFAULT_HOME "SYS$LOGIN:"
318
d02b48c6 319# else
06018c46 320 /* !defined VMS */
0f113f3e
MC
321# ifdef OPENSSL_UNISTD
322# include OPENSSL_UNISTD
323# else
324# include <unistd.h>
325# endif
b379fe6c 326# include <sys/types.h>
0f113f3e
MC
327# ifdef OPENSSL_SYS_WIN32_CYGWIN
328# include <io.h>
329# include <fcntl.h>
330# endif
331
0f113f3e 332# define LIST_SEPARATOR_CHAR ':'
0f113f3e 333# define EXIT(n) exit(n)
d02b48c6 334# endif
d02b48c6 335
0f113f3e 336# endif
7d7d2cbc 337
d02b48c6
RE
338/***********************************************/
339
0f113f3e 340# if defined(OPENSSL_SYS_WINDOWS)
e6fa67fa
RL
341# define strcasecmp _stricmp
342# define strncasecmp _strnicmp
dc6b5c7b
RL
343# if (_MSC_VER >= 1310)
344# define open _open
345# define fdopen _fdopen
346# define close _close
8d95ca36
M
347# ifndef strdup
348# define strdup _strdup
349# endif
dc6b5c7b 350# define unlink _unlink
2e38091c 351# define fileno _fileno
dc6b5c7b 352# endif
7233bea2
RL
353# else
354# include <strings.h>
0f113f3e 355# endif
3bfd99bf 356
6a89a25c 357/* vxworks */
0f113f3e
MC
358# if defined(OPENSSL_SYS_VXWORKS)
359# include <ioLib.h>
360# include <tickLib.h>
361# include <sysLib.h>
0f113f3e
MC
362# include <vxWorks.h>
363# include <sockLib.h>
364# include <taskLib.h>
6a89a25c 365
0e97f1e1
RS
366# define TTY_STRUCT int
367# define sleep(a) taskDelay((a) * sysClkRateGet())
6a89a25c 368
0f113f3e
MC
369/*
370 * NOTE: these are implemented by helpers in database app! if the database is
a303e9a6 371 * not linked, we need to implement them elsewhere
0f113f3e 372 */
6a89a25c
RL
373struct hostent *gethostbyname(const char *name);
374struct hostent *gethostbyaddr(const char *addr, int length, int type);
375struct servent *getservbyname(const char *name, const char *proto);
376
0f113f3e 377# endif
6a89a25c
RL
378/* end vxworks */
379
43c56417
KR
380#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
381# define CRYPTO_memcmp memcmp
382#endif
383
d02b48c6
RE
384#ifdef __cplusplus
385}
386#endif
387
388#endif