X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Ftls.c;h=55295108c1315038968945d09e6a2c871f8b82d2;hb=63af6f3a15c5c4779761761bd4d6185e4679eafc;hp=b5ef965951ff3634471f7777438ebf2052877481;hpb=e51c7be22dfccad376659a1a46cee93c9979bbf7;p=exim.git diff --git a/src/src/tls.c b/src/src/tls.c index b5ef96595..55295108c 100644 --- a/src/src/tls.c +++ b/src/src/tls.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2012 */ +/* Copyright (c) University of Cambridge 1995 - 2016 */ /* See the file NOTICE for conditions of use and distribution. */ /* This module provides TLS (aka SSL) support for Exim. The code for OpenSSL is @@ -80,23 +80,46 @@ return TRUE; } +/************************************************* +* Timezone environment flipping * +*************************************************/ + +static uschar * +to_tz(uschar * tz) +{ +uschar * old = US getenv("TZ"); +(void) setenv("TZ", CCS tz, 1); +tzset(); +return old; +} + +static void +restore_tz(uschar * tz) +{ +if (tz) + (void) setenv("TZ", CCS tz, 1); +else + (void) os_unsetenv(US"TZ"); +tzset(); +} + /************************************************* * Many functions are package-specific * *************************************************/ #ifdef USE_GNUTLS -#include "tls-gnu.c" -#include "tlscert-gnu.c" +# 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) +# 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) #else -#include "tls-openssl.c" -#include "tlscert-openssl.c" +# include "tls-openssl.c" +# include "tlscert-openssl.c" #endif @@ -196,6 +219,8 @@ modify_variable(US"tls_sni", &dest_tsp->sni); #endif } + +#ifdef SUPPORT_TLS /************************************************ * TLS certificate name operations * ************************************************/ @@ -222,7 +247,7 @@ NOTE: We modify the supplied dn string during operation. Arguments: dn Distinguished Name string - mod string containing optional list-sep and + mod list containing optional output list-sep and field selector match, comma-separated Return: allocated string with list of matching fields, @@ -230,7 +255,7 @@ Return: */ uschar * -tls_field_from_dn(uschar * dn, uschar * mod) +tls_field_from_dn(uschar * dn, const uschar * mod) { int insep = ','; uschar outsep = '\n'; @@ -239,23 +264,24 @@ uschar * match = NULL; int len; uschar * list = NULL; -while (ele = string_nextinlist(&mod, &insep, NULL, 0)) +while ((ele = string_nextinlist(&mod, &insep, NULL, 0))) if (ele[0] != '>') match = ele; /* field tag to match */ else if (ele[1]) - outsep = ele[1]; /* nondefault separator */ + outsep = ele[1]; /* nondefault output separator */ dn_to_list(dn); insep = ','; -len = Ustrlen(match); -while (ele = string_nextinlist(&dn, &insep, NULL, 0)) - if (Ustrncmp(ele, match, len) == 0 && ele[len] == '=') +len = match ? Ustrlen(match) : -1; +while ((ele = string_nextinlist(CUSS &dn, &insep, NULL, 0))) + if ( !match + || Ustrncmp(ele, match, len) == 0 && ele[len] == '=' + ) list = string_append_listele(list, outsep, ele+len+1); return list; } -#ifdef EXPERIMENTAL_CERTNAMES /* Compare a domain name with a possibly-wildcarded name. Wildcards are restricted to a single one, as the first element of patterns having at least three dot-separated elements. Case-independent. @@ -288,7 +314,7 @@ Returns: */ BOOL -tls_is_name_for_cert(uschar * namelist, void * cert) +tls_is_name_for_cert(const uschar * namelist, void * cert) { uschar * altnames = tls_cert_subject_altname(cert, US"dns"); uschar * subjdn; @@ -299,10 +325,10 @@ uschar * cmpname; if ((altnames = tls_cert_subject_altname(cert, US"dns"))) { int alt_sep = '\n'; - while (cmpname = string_nextinlist(&namelist, &cmp_sep, NULL, 0)) + while ((cmpname = string_nextinlist(&namelist, &cmp_sep, NULL, 0))) { - uschar * an = altnames; - while (certname = string_nextinlist(&an, &alt_sep, NULL, 0)) + const uschar * an = altnames; + while ((certname = string_nextinlist(&an, &alt_sep, NULL, 0))) if (is_name_match(cmpname, certname)) return TRUE; } @@ -311,13 +337,12 @@ if ((altnames = tls_cert_subject_altname(cert, US"dns"))) else if ((subjdn = tls_cert_subject(cert, NULL))) { int sn_sep = ','; - uschar * sn; dn_to_list(subjdn); - while (cmpname = string_nextinlist(&namelist, &cmp_sep, NULL, 0)) + while ((cmpname = string_nextinlist(&namelist, &cmp_sep, NULL, 0))) { - uschar * sn = subjdn; - while (certname = string_nextinlist(&sn, &sn_sep, NULL, 0)) + const uschar * sn = subjdn; + while ((certname = string_nextinlist(&sn, &sn_sep, NULL, 0))) if ( *certname++ == 'C' && *certname++ == 'N' && *certname++ == '=' @@ -328,7 +353,7 @@ else if ((subjdn = tls_cert_subject(cert, NULL))) } return FALSE; } -#endif +#endif /*SUPPORT_TLS*/ /* vi: aw ai sw=2 */