-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathhandle_ssl_error.c
More file actions
80 lines (65 loc) · 2.27 KB
/
Copy pathhandle_ssl_error.c
File metadata and controls
80 lines (65 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <errno.h>
#include "cli-sub.h"
#include "http-fetch.h"
#include "err_ref.h"
/* --- */
int handle_ssl_error( int *sslact, SSL *ssl, int io_rc, int sock, int max_wait)
{
int rc = RC_NORMAL, sysrc, event, err;
ENTER( "handle_ssl_error")
err = SSL_get_error( ssl, io_rc);
#ifdef DEV_DEBUGGING
if(err==SSL_ERROR_WANT_READ) printf("dbg:: HSE, err=want-read");
else if(err==SSL_ERROR_WANT_WRITE) printf("dbg:: HSE, err=want-write");
else if(err==SSL_ERROR_WANT_CONNECT) printf("dbg:: HSE, err=want-connect");
else if(err==SSL_ERROR_WANT_ACCEPT) printf("dbg:: HSE, err=want-accept");
else if(err==SSL_ERROR_WANT_X509_LOOKUP) printf("dbg:: HSE, err=want-X509");
else if(err==SSL_ERROR_SYSCALL) printf("dbg:: HSE, err=syscall");
else if(err==SSL_ERROR_ZERO_RETURN) printf("dbg:: HSE, err=zero");
else if(err==SSL_ERROR_SSL) printf("dbg:: HSE, err=ssl");
else printf("dbg:: HSE, err=other");
printf(" s:%d e:%d\n", err, errno);
#endif
if( err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
{
if( err == SSL_ERROR_WANT_READ) event = POLL_EVENTS_READ;
else event = POLL_EVENTS_WRITE;
sysrc = wait_until_sock_ready( sock, event, max_wait);
if( sysrc > 0 && err == SSL_ERROR_WANT_WRITE) *sslact = SSLACT_WRITE;
else if( sysrc > 0 && err == SSL_ERROR_WANT_READ) *sslact = SSLACT_READ;
else
{
*sslact = SSLACT_ERR_FATAL;
if( !sysrc) rc = ERR_POLL_TIMEOUT;
else rc = ERR_POLL_FAILED;
}
}
else if( err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_ACCEPT
|| err == SSL_ERROR_WANT_X509_LOOKUP) *sslact = SSLACT_RETRY;
else if( err == SSL_ERROR_SYSCALL)
{
err = errno;
if( err == EAGAIN || err == EBUSY || err == EINTR
|| err == EWOULDBLOCK || err == EINPROGRESS) *sslact = SSLACT_RETRY;
#ifndef __APPLE__
else if( err == ERESTART) *sslact = SSLACT_RETRY;
#endif
else
{
rc = ERR_SYS_CALL;
*sslact = SSLACT_ERR_HANDSHAKE;
}
}
else if( err == SSL_ERROR_ZERO_RETURN)
{
rc = ERR_SSL_EOS;
*sslact = SSLACT_ERR_CLOSED;
}
else
{
rc = ERR_SSL_ERROR;
*sslact = SSLACT_ERR_FATAL;
}
LEAVE( "handle_ssl_error")
return( rc);
}