@@ -55,53 +55,65 @@ struct ssl_args {
55
55
56
56
STATIC const mp_obj_type_t ussl_socket_type ;
57
57
58
- // Table of errors
59
- struct ssl_errs {
60
- int16_t errnum ;
61
- const char * errstr ;
58
+ // Table of error strings corresponding to SSL_xxx error codes.
59
+ STATIC const char * const ssl_error_tab1 [] = {
60
+ "NOT_OK" ,
61
+ "DEAD" ,
62
+ "CLOSE_NOTIFY" ,
63
+ "EAGAIN" ,
62
64
};
63
- STATIC const struct ssl_errs ssl_error_tab [] = {
64
- { SSL_NOT_OK , "NOT_OK" },
65
- { SSL_ERROR_DEAD , "DEAD" },
66
- { SSL_CLOSE_NOTIFY , "CLOSE_NOTIFY" },
67
- { SSL_EAGAIN , "EAGAIN" },
68
- { SSL_ERROR_CONN_LOST , "CONN_LOST" },
69
- { SSL_ERROR_RECORD_OVERFLOW , "RECORD_OVERFLOW" },
70
- { SSL_ERROR_SOCK_SETUP_FAILURE , "SOCK_SETUP_FAILURE" },
71
- { SSL_ERROR_INVALID_HANDSHAKE , "INVALID_HANDSHAKE" },
72
- { SSL_ERROR_INVALID_PROT_MSG , "INVALID_PROT_MSG" },
73
- { SSL_ERROR_INVALID_HMAC , "INVALID_HMAC" },
74
- { SSL_ERROR_INVALID_VERSION , "INVALID_VERSION" },
75
- { SSL_ERROR_UNSUPPORTED_EXTENSION , "UNSUPPORTED_EXTENSION" },
76
- { SSL_ERROR_INVALID_SESSION , "INVALID_SESSION" },
77
- { SSL_ERROR_NO_CIPHER , "NO_CIPHER" },
78
- { SSL_ERROR_INVALID_CERT_HASH_ALG , "INVALID_CERT_HASH_ALG" },
79
- { SSL_ERROR_BAD_CERTIFICATE , "BAD_CERTIFICATE" },
80
- { SSL_ERROR_INVALID_KEY , "INVALID_KEY" },
81
- { SSL_ERROR_FINISHED_INVALID , "FINISHED_INVALID" },
82
- { SSL_ERROR_NO_CERT_DEFINED , "NO_CERT_DEFINED" },
83
- { SSL_ERROR_NO_CLIENT_RENOG , "NO_CLIENT_RENOG" },
84
- { SSL_ERROR_NOT_SUPPORTED , "NOT_SUPPORTED" },
65
+ STATIC const char * const ssl_error_tab2 [] = {
66
+ "CONN_LOST" ,
67
+ "RECORD_OVERFLOW" ,
68
+ "SOCK_SETUP_FAILURE" ,
69
+ NULL ,
70
+ "INVALID_HANDSHAKE" ,
71
+ "INVALID_PROT_MSG" ,
72
+ "INVALID_HMAC" ,
73
+ "INVALID_VERSION" ,
74
+ "UNSUPPORTED_EXTENSION" ,
75
+ "INVALID_SESSION" ,
76
+ "NO_CIPHER" ,
77
+ "INVALID_CERT_HASH_ALG" ,
78
+ "BAD_CERTIFICATE" ,
79
+ "INVALID_KEY" ,
80
+ NULL ,
81
+ "FINISHED_INVALID" ,
82
+ "NO_CERT_DEFINED" ,
83
+ "NO_CLIENT_RENOG" ,
84
+ "NOT_SUPPORTED" ,
85
85
};
86
86
87
87
STATIC NORETURN void ussl_raise_error (int err ) {
88
- for (size_t i = 0 ; i < MP_ARRAY_SIZE (ssl_error_tab ); i ++ ) {
89
- if (ssl_error_tab [i ].errnum == err ) {
90
- // construct string object
91
- mp_obj_str_t * o_str = m_new_obj_maybe (mp_obj_str_t );
92
- if (o_str == NULL ) {
93
- break ;
94
- }
95
- o_str -> base .type = & mp_type_str ;
96
- o_str -> data = (const byte * )ssl_error_tab [i ].errstr ;
97
- o_str -> len = strlen ((char * )o_str -> data );
98
- o_str -> hash = qstr_compute_hash (o_str -> data , o_str -> len );
99
- // raise
100
- mp_obj_t args [2 ] = { MP_OBJ_NEW_SMALL_INT (err ), MP_OBJ_FROM_PTR (o_str )};
101
- nlr_raise (mp_obj_exception_make_new (& mp_type_OSError , 2 , 0 , args ));
102
- }
88
+ MP_STATIC_ASSERT (SSL_NOT_OK - 3 == SSL_EAGAIN );
89
+ MP_STATIC_ASSERT (SSL_ERROR_CONN_LOST - 18 == SSL_ERROR_NOT_SUPPORTED );
90
+
91
+ // Check if err corresponds to something in one of the error string tables.
92
+ const char * errstr = NULL ;
93
+ if (SSL_NOT_OK >= err && err >= SSL_EAGAIN ) {
94
+ errstr = ssl_error_tab1 [SSL_NOT_OK - err ];
95
+ } else if (SSL_ERROR_CONN_LOST >= err && err >= SSL_ERROR_NOT_SUPPORTED ) {
96
+ errstr = ssl_error_tab2 [SSL_ERROR_CONN_LOST - err ];
97
+ }
98
+
99
+ // Unknown error, just raise the error code.
100
+ if (errstr == NULL ) {
101
+ mp_raise_OSError (err );
102
+ }
103
+
104
+ // Construct string object.
105
+ mp_obj_str_t * o_str = m_new_obj_maybe (mp_obj_str_t );
106
+ if (o_str == NULL ) {
107
+ mp_raise_OSError (err );
103
108
}
104
- mp_raise_OSError (err );
109
+ o_str -> base .type = & mp_type_str ;
110
+ o_str -> data = (const byte * )errstr ;
111
+ o_str -> len = strlen ((char * )o_str -> data );
112
+ o_str -> hash = qstr_compute_hash (o_str -> data , o_str -> len );
113
+
114
+ // Raise OSError(err, str).
115
+ mp_obj_t args [2 ] = { MP_OBJ_NEW_SMALL_INT (err ), MP_OBJ_FROM_PTR (o_str )};
116
+ nlr_raise (mp_obj_exception_make_new (& mp_type_OSError , 2 , 0 , args ));
105
117
}
106
118
107
119
0 commit comments