sfsasl.c (203004) | sfsasl.c (249729) |
---|---|
1/* 2 * Copyright (c) 1999-2006, 2008 Sendmail, Inc. and its suppliers. 3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 */ 10 11#include <sm/gen.h> | 1/* 2 * Copyright (c) 1999-2006, 2008 Sendmail, Inc. and its suppliers. 3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 */ 10 11#include <sm/gen.h> |
12SM_RCSID("@(#)$Id: sfsasl.c,v 8.118 2008/07/22 15:12:48 ca Exp $") | 12SM_RCSID("@(#)$Id: sfsasl.c,v 8.120 2013/03/15 17:49:12 guenther Exp $") |
13#include <stdlib.h> 14#include <sendmail.h> 15#include <sm/time.h> 16#include <errno.h> 17 18/* allow to disable error handling code just in case... */ 19#ifndef DEAL_WITH_ERROR_SSL 20# define DEAL_WITH_ERROR_SSL 1 --- 602 unchanged lines hidden (view full) --- 623 (err == SSL_ERROR_WANT_WRITE && wfd >= FD_SETSIZE))) 624 { 625 if (LogLevel > 5) 626 { 627 sm_syslog(LOG_ERR, NOQID, 628 "STARTTLS=%s, error: fd %d/%d too large", 629 where, rfd, wfd); 630 if (LogLevel > 8) | 13#include <stdlib.h> 14#include <sendmail.h> 15#include <sm/time.h> 16#include <errno.h> 17 18/* allow to disable error handling code just in case... */ 19#ifndef DEAL_WITH_ERROR_SSL 20# define DEAL_WITH_ERROR_SSL 1 --- 602 unchanged lines hidden (view full) --- 623 (err == SSL_ERROR_WANT_WRITE && wfd >= FD_SETSIZE))) 624 { 625 if (LogLevel > 5) 626 { 627 sm_syslog(LOG_ERR, NOQID, 628 "STARTTLS=%s, error: fd %d/%d too large", 629 where, rfd, wfd); 630 if (LogLevel > 8) |
631 tlslogerr(where); | 631 tlslogerr(LOG_WARNING, where); |
632 } 633 errno = EINVAL; 634 } 635 else if (err == SSL_ERROR_WANT_READ) 636 { 637 fd_set ssl_maskr, ssl_maskx; | 632 } 633 errno = EINVAL; 634 } 635 else if (err == SSL_ERROR_WANT_READ) 636 { 637 fd_set ssl_maskr, ssl_maskx; |
638 int save_errno = errno; |
|
638 639 FD_ZERO(&ssl_maskr); 640 FD_SET(rfd, &ssl_maskr); 641 FD_ZERO(&ssl_maskx); 642 FD_SET(rfd, &ssl_maskx); 643 do 644 { 645 ret = select(rfd + 1, &ssl_maskr, NULL, &ssl_maskx, 646 &tv); 647 } while (ret < 0 && errno == EINTR); 648 if (ret < 0 && errno > 0) 649 ret = -errno; | 639 640 FD_ZERO(&ssl_maskr); 641 FD_SET(rfd, &ssl_maskr); 642 FD_ZERO(&ssl_maskx); 643 FD_SET(rfd, &ssl_maskx); 644 do 645 { 646 ret = select(rfd + 1, &ssl_maskr, NULL, &ssl_maskx, 647 &tv); 648 } while (ret < 0 && errno == EINTR); 649 if (ret < 0 && errno > 0) 650 ret = -errno; |
651 errno = save_errno; |
|
650 } 651 else if (err == SSL_ERROR_WANT_WRITE) 652 { 653 fd_set ssl_maskw, ssl_maskx; | 652 } 653 else if (err == SSL_ERROR_WANT_WRITE) 654 { 655 fd_set ssl_maskw, ssl_maskx; |
656 int save_errno = errno; |
|
654 655 FD_ZERO(&ssl_maskw); 656 FD_SET(wfd, &ssl_maskw); 657 FD_ZERO(&ssl_maskx); 658 FD_SET(rfd, &ssl_maskx); 659 do 660 { 661 ret = select(wfd + 1, NULL, &ssl_maskw, &ssl_maskx, 662 &tv); 663 } while (ret < 0 && errno == EINTR); 664 if (ret < 0 && errno > 0) 665 ret = -errno; | 657 658 FD_ZERO(&ssl_maskw); 659 FD_SET(wfd, &ssl_maskw); 660 FD_ZERO(&ssl_maskx); 661 FD_SET(rfd, &ssl_maskx); 662 do 663 { 664 ret = select(wfd + 1, NULL, &ssl_maskw, &ssl_maskx, 665 &tv); 666 } while (ret < 0 && errno == EINTR); 667 if (ret < 0 && errno > 0) 668 ret = -errno; |
669 errno = save_errno; |
|
666 } 667 return ret; 668} 669 670/* errno to force refill() etc to stop (see IS_IO_ERROR()) */ 671#ifdef ETIMEDOUT 672# define SM_ERR_TIMEOUT ETIMEDOUT 673#else /* ETIMEDOUT */ --- 91 unchanged lines hidden (view full) --- 765*/ 766 break; 767 case SSL_ERROR_SSL: 768#if DEAL_WITH_ERROR_SSL 769 if (r == 0 && errno == 0) /* out of protocol EOF found */ 770 break; 771#endif /* DEAL_WITH_ERROR_SSL */ 772 err = "generic SSL error"; | 670 } 671 return ret; 672} 673 674/* errno to force refill() etc to stop (see IS_IO_ERROR()) */ 675#ifdef ETIMEDOUT 676# define SM_ERR_TIMEOUT ETIMEDOUT 677#else /* ETIMEDOUT */ --- 91 unchanged lines hidden (view full) --- 769*/ 770 break; 771 case SSL_ERROR_SSL: 772#if DEAL_WITH_ERROR_SSL 773 if (r == 0 && errno == 0) /* out of protocol EOF found */ 774 break; 775#endif /* DEAL_WITH_ERROR_SSL */ 776 err = "generic SSL error"; |
777 |
|
773 if (LogLevel > 9) | 778 if (LogLevel > 9) |
774 tlslogerr("read"); | 779 { 780 int pri; |
775 | 781 |
782 if (errno == EAGAIN && try > 0) 783 pri = LOG_DEBUG; 784 else 785 pri = LOG_WARNING; 786 tlslogerr(pri, "read"); 787 } 788 |
|
776#if DEAL_WITH_ERROR_SSL 777 /* avoid repeated calls? */ 778 if (r == 0) 779 r = -1; 780#endif /* DEAL_WITH_ERROR_SSL */ 781 break; 782 } 783 if (err != NULL) 784 { 785 int save_errno; 786 787 save_errno = (errno == 0) ? EIO : errno; 788 if (try == 0 && save_errno == SM_ERR_TIMEOUT) 789 { 790 if (LogLevel > 7) 791 sm_syslog(LOG_WARNING, NOQID, 792 "STARTTLS: read error=timeout"); 793 } 794 else if (LogLevel > 8) | 789#if DEAL_WITH_ERROR_SSL 790 /* avoid repeated calls? */ 791 if (r == 0) 792 r = -1; 793#endif /* DEAL_WITH_ERROR_SSL */ 794 break; 795 } 796 if (err != NULL) 797 { 798 int save_errno; 799 800 save_errno = (errno == 0) ? EIO : errno; 801 if (try == 0 && save_errno == SM_ERR_TIMEOUT) 802 { 803 if (LogLevel > 7) 804 sm_syslog(LOG_WARNING, NOQID, 805 "STARTTLS: read error=timeout"); 806 } 807 else if (LogLevel > 8) |
795 sm_syslog(LOG_WARNING, NOQID, | 808 { 809 int pri; 810 811 if (save_errno == EAGAIN && try > 0) 812 pri = LOG_DEBUG; 813 else 814 pri = LOG_WARNING; 815 sm_syslog(pri, NOQID, |
796 "STARTTLS: read error=%s (%d), errno=%d, get_error=%s, retry=%d, ssl_err=%d", 797 err, r, errno, 798 ERR_error_string(ERR_get_error(), NULL), try, 799 ssl_err); | 816 "STARTTLS: read error=%s (%d), errno=%d, get_error=%s, retry=%d, ssl_err=%d", 817 err, r, errno, 818 ERR_error_string(ERR_get_error(), NULL), try, 819 ssl_err); |
820 } |
|
800 else if (LogLevel > 7) 801 sm_syslog(LOG_WARNING, NOQID, 802 "STARTTLS: read error=%s (%d), retry=%d, ssl_err=%d", 803 err, r, errno, try, ssl_err); 804 errno = save_errno; 805 } 806 return r; 807} --- 65 unchanged lines hidden (view full) --- 873*/ 874 break; 875 case SSL_ERROR_SSL: 876 err = "generic SSL error"; 877/* 878 ERR_GET_REASON(ERR_peek_error())); 879*/ 880 if (LogLevel > 9) | 821 else if (LogLevel > 7) 822 sm_syslog(LOG_WARNING, NOQID, 823 "STARTTLS: read error=%s (%d), retry=%d, ssl_err=%d", 824 err, r, errno, try, ssl_err); 825 errno = save_errno; 826 } 827 return r; 828} --- 65 unchanged lines hidden (view full) --- 894*/ 895 break; 896 case SSL_ERROR_SSL: 897 err = "generic SSL error"; 898/* 899 ERR_GET_REASON(ERR_peek_error())); 900*/ 901 if (LogLevel > 9) |
881 tlslogerr("write"); | 902 tlslogerr(LOG_WARNING, "write"); |
882 883#if DEAL_WITH_ERROR_SSL 884 /* avoid repeated calls? */ 885 if (r == 0) 886 r = -1; 887#endif /* DEAL_WITH_ERROR_SSL */ 888 break; 889 } --- 85 unchanged lines hidden --- | 903 904#if DEAL_WITH_ERROR_SSL 905 /* avoid repeated calls? */ 906 if (r == 0) 907 r = -1; 908#endif /* DEAL_WITH_ERROR_SSL */ 909 break; 910 } --- 85 unchanged lines hidden --- |