8000 extmod/modussl_axtls: Reduce size of code that makes exception. · tve/micropython@373b400 · GitHub
[go: up one dir, main page]

Skip to content

Commit 373b400

Browse files
committed
extmod/modussl_axtls: Reduce size of code that makes exception.
Change in code size (for ports that use axtls) is: unix x64: -152 -0.030% [incl -160(data)] unix nanbox: -112 -0.025% [incl -96(data)] esp8266: -64 -0.009% GENERIC Signed-off-by: Damien George <damien@micropython.org>
1 parent 2e54d9d commit 373b400

File tree

1 file changed

+54
-42
lines changed

1 file changed

+54
-42
lines changed

extmod/modussl_axtls.c

Lines changed: 54 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -55,53 +55,65 @@ struct ssl_args {
5555

5656
STATIC const mp_obj_type_t ussl_socket_type;
5757

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",
6264
};
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",
8585
};
8686

8787
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);
103108
}
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));
105117
}
106118

107119

0 commit comments

Comments
 (0)
0