X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/27f19eb43163f6ed613a68986677c840102827ef..9f707b896c28e71a6365bab01977f13b97219e64:/src/src/tls.c diff --git a/src/src/tls.c b/src/src/tls.c index a3658276f..796bc6d61 100644 --- a/src/src/tls.c +++ b/src/src/tls.c @@ -2,13 +2,13 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2015 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ /* This module provides TLS (aka SSL) support for Exim. The code for OpenSSL is based on a patch that was originally contributed by Steve Haslam. It was adapted from stunnel, a GPL program by Michal Trojnara. The code for GNU TLS is -based on a patch contributed by Nikos Mavroyanopoulos. Because these packages +based on a patch contributed by Nikos Mavrogiannopoulos. Because these packages are so very different, the functions for each are kept in separate files. The relevant file is #included as required, after any any common functions. @@ -19,6 +19,22 @@ functions from the OpenSSL or GNU TLS libraries. */ #include "exim.h" #include "transports/smtp.h" +#if !defined(DISABLE_TLS) && !defined(USE_OPENSSL) && !defined(USE_GNUTLS) +# error One of USE_OPENSSL or USE_GNUTLS must be defined for a TLS build +#endif + + +#if defined(MACRO_PREDEF) && !defined(DISABLE_TLS) +# include "macro_predef.h" +# ifdef USE_GNUTLS +# include "tls-gnu.c" +# else +# include "tls-openssl.c" +# endif +#endif + +#ifndef MACRO_PREDEF + /* This module is compiled only when it is specifically requested in the build-time configuration. However, some compilers don't like compiling empty modules, so keep them happy with a dummy when skipping the rest. Make it @@ -26,7 +42,7 @@ reference itself to stop picky compilers complaining that it is unused, and put in a dummy argument to stop even pickier compilers complaining about infinite loops. */ -#ifndef SUPPORT_TLS +#ifdef DISABLE_TLS static void dummy(int x) { dummy(x-1); } #else @@ -37,12 +53,12 @@ We're moving away from this; GnuTLS is already using a state, which can switch, so we can do TLS callouts during ACLs. */ static const int ssl_xfer_buffer_size = 4096; -#ifndef USE_GNUTLS +#ifdef USE_OPENSSL static uschar *ssl_xfer_buffer = NULL; static int ssl_xfer_buffer_lwm = 0; static int ssl_xfer_buffer_hwm = 0; -static int ssl_xfer_eof = 0; -static int ssl_xfer_error = 0; +static int ssl_xfer_eof = FALSE; +static BOOL ssl_xfer_error = FALSE; #endif uschar *tls_channelbinding_b64 = NULL; @@ -64,17 +80,18 @@ Returns: TRUE if OK; result may still be NULL after forced failure */ static BOOL -expand_check(const uschar *s, const uschar *name, uschar **result) +expand_check(const uschar *s, const uschar *name, uschar **result, uschar ** errstr) { -if (s == NULL) *result = NULL; else +if (!s) + *result = NULL; +else if ( !(*result = expand_string(US s)) /* need to clean up const more */ + && !f.expand_string_forcedfail + ) { - *result = expand_string(US s); /* need to clean up const some more */ - if (*result == NULL && !expand_string_forcedfail) - { - log_write(0, LOG_MAIN|LOG_PANIC, "expansion of %s failed: %s", name, - expand_string_message); - return FALSE; - } + *errstr = US"Internal error"; + log_write(0, LOG_MAIN|LOG_PANIC, "expansion of %s failed: %s", name, + expand_string_message); + return FALSE; } return TRUE; } @@ -87,19 +104,20 @@ return TRUE; static uschar * to_tz(uschar * tz) { - uschar * old = US getenv("TZ"); - setenv("TZ", CS tz, 1); - tzset(); - return old; +uschar * old = US getenv("TZ"); +(void) setenv("TZ", CCS tz, 1); +tzset(); +return old; } + static void restore_tz(uschar * tz) { - if (tz) - setenv("TZ", CS tz, 1); - else - unsetenv("TZ"); - tzset(); +if (tz) + (void) setenv("TZ", CCS tz, 1); +else + (void) os_unsetenv(US"TZ"); +tzset(); } /************************************************* @@ -109,14 +127,14 @@ restore_tz(uschar * tz) #ifdef USE_GNUTLS # include "tls-gnu.c" # include "tlscert-gnu.c" - # define ssl_xfer_buffer (state_server.xfer_buffer) # define ssl_xfer_buffer_lwm (state_server.xfer_buffer_lwm) # define ssl_xfer_buffer_hwm (state_server.xfer_buffer_hwm) # define ssl_xfer_eof (state_server.xfer_eof) # define ssl_xfer_error (state_server.xfer_error) +#endif -#else +#ifdef USE_OPENSSL # include "tls-openssl.c" # include "tlscert-openssl.c" #endif @@ -160,7 +178,7 @@ Returns: non-zero if the eof flag is set int tls_feof(void) { -return ssl_xfer_eof; +return (int)ssl_xfer_eof; } @@ -182,7 +200,7 @@ Returns: non-zero if the error flag is set int tls_ferror(void) { -return ssl_xfer_error; +return (int)ssl_xfer_error; } @@ -204,7 +222,7 @@ return ssl_xfer_buffer_lwm < ssl_xfer_buffer_hwm; } -#endif /* SUPPORT_TLS */ +#endif /*DISABLE_TLS*/ void tls_modify_variables(tls_support * dest_tsp) @@ -213,13 +231,13 @@ modify_variable(US"tls_bits", &dest_tsp->bits); modify_variable(US"tls_certificate_verified", &dest_tsp->certificate_verified); modify_variable(US"tls_cipher", &dest_tsp->cipher); modify_variable(US"tls_peerdn", &dest_tsp->peerdn); -#if defined(SUPPORT_TLS) && !defined(USE_GNUTLS) +#ifdef USE_OPENSSL modify_variable(US"tls_sni", &dest_tsp->sni); #endif } -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS /************************************************ * TLS certificate name operations * ************************************************/ @@ -233,8 +251,7 @@ inplace. static void dn_to_list(uschar * dn) { -uschar * cp; -for (cp = dn; *cp; cp++) +for (uschar * cp = dn; *cp; cp++) if (cp[0] == '\\' && cp[1] == ',') *cp++ = ','; } @@ -261,7 +278,7 @@ uschar outsep = '\n'; uschar * ele; uschar * match = NULL; int len; -uschar * list = NULL; +gstring * list = NULL; while ((ele = string_nextinlist(&mod, &insep, NULL, 0))) if (ele[0] != '>') @@ -277,7 +294,7 @@ while ((ele = string_nextinlist(CUSS &dn, &insep, NULL, 0))) || Ustrncmp(ele, match, len) == 0 && ele[len] == '=' ) list = string_append_listele(list, outsep, ele+len+1); -return list; +return string_from_gstring(list); } @@ -352,7 +369,8 @@ else if ((subjdn = tls_cert_subject(cert, NULL))) } return FALSE; } -#endif /*SUPPORT_TLS*/ +#endif /*!DISABLE_TLS*/ +#endif /*!MACRO_PREDEF*/ /* vi: aw ai sw=2 */