Skip to content

Commit 77bf438

Browse files
committed
WIP make bind & listen into void functions (they throw exceptions)
1 parent f960c5b commit 77bf438

File tree

3 files changed

+21
-26
lines changed

3 files changed

+21
-26
lines changed

shared-bindings/ssl/SSLSocket.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,7 @@ STATIC mp_obj_t ssl_sslsocket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
8888
mp_obj_t *addr_items;
8989
mp_obj_get_array_fixed_n(addr_in, 2, &addr_items);
9090

91-
size_t error = common_hal_ssl_sslsocket_bind(self, addr_in);
92-
if (error != 0) {
93-
mp_raise_OSError(error);
94-
}
95-
91+
common_hal_ssl_sslsocket_bind(self, addr_in);
9692
return mp_const_none;
9793
}
9894
STATIC MP_DEFINE_CONST_FUN_OBJ_2(ssl_sslsocket_bind_obj, ssl_sslsocket_bind);

shared-bindings/ssl/SSLSocket.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@
3535
extern const mp_obj_type_t ssl_sslsocket_type;
3636

3737
mp_obj_t common_hal_ssl_sslsocket_accept(ssl_sslsocket_obj_t *self);
38-
size_t common_hal_ssl_sslsocket_bind(ssl_sslsocket_obj_t *self, mp_obj_t addr);
38+
void common_hal_ssl_sslsocket_bind(ssl_sslsocket_obj_t *self, mp_obj_t addr);
3939
void common_hal_ssl_sslsocket_close(ssl_sslsocket_obj_t *self);
4040
void common_hal_ssl_sslsocket_connect(ssl_sslsocket_obj_t *self, mp_obj_t addr);
4141
bool common_hal_ssl_sslsocket_get_closed(ssl_sslsocket_obj_t *self);
4242
bool common_hal_ssl_sslsocket_get_connected(ssl_sslsocket_obj_t *self);
43-
bool common_hal_ssl_sslsocket_listen(ssl_sslsocket_obj_t *self, int backlog);
43+
void common_hal_ssl_sslsocket_listen(ssl_sslsocket_obj_t *self, int backlog);
4444
mp_uint_t common_hal_ssl_sslsocket_recv_into(ssl_sslsocket_obj_t *self, uint8_t *buf, uint32_t len);
4545
mp_uint_t common_hal_ssl_sslsocket_send(ssl_sslsocket_obj_t *self, const uint8_t *buf, uint32_t len);
4646
void common_hal_ssl_sslsocket_settimeout(ssl_sslsocket_obj_t *self, mp_obj_t timeout_obj);

shared-module/ssl/SSLSocket.c

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ STATIC NORETURN void mbedtls_raise_error(int err) {
106106
#endif
107107
}
108108

109+
// Because ssl_socket_send and ssl_socket_recv_into are callbacks from mbedtls code,
110+
// it is not OK to exit them by raising an exception (nlr_jump'ing through
111+
// foreign code is not permitted). Instead, preserve the error number of any OSError
112+
// and turn anything else into -MP_EINVAL.
109113
STATIC int call_method_errno(size_t n_args, const mp_obj_t *args) {
110114
nlr_buf_t nlr;
111115
mp_int_t result = -MP_EINVAL;
@@ -140,28 +144,28 @@ static int ssl_socket_recv_into(ssl_sslsocket_obj_t *self, byte *buf, size_t len
140144
return call_method_errno(1, self->recv_into_args);
141145
}
142146

143-
static int ssl_socket_connect(ssl_sslsocket_obj_t *self, mp_obj_t addr_in) {
147+
static void ssl_socket_connect(ssl_sslsocket_obj_t *self, mp_obj_t addr_in) {
144148
self->connect_args[2] = addr_in;
145-
return call_method_errno(1, self->connect_args);
149+
mp_call_method_n_kw(1, 0, self->connect_args);
146150
}
147151

148-
static int ssl_socket_bind(ssl_sslsocket_obj_t *self, mp_obj_t addr_in) {
152+
static void ssl_socket_bind(ssl_sslsocket_obj_t *self, mp_obj_t addr_in) {
149153
self->bind_args[2] = addr_in;
150-
return call_method_errno(1, self->bind_args);
154+
mp_call_method_n_kw(1, 0, self->bind_args);
151155
}
152156

153-
static int ssl_socket_close(ssl_sslsocket_obj_t *self) {
154-
return call_method_errno(0, self->close_args);
157+
static void ssl_socket_close(ssl_sslsocket_obj_t *self) {
158+
mp_call_method_n_kw(0, 0, self->close_args);
155159
}
156160

157161
static void ssl_socket_settimeout(ssl_sslsocket_obj_t *self, mp_obj_t timeout_obj) {
158162
self->settimeout_args[2] = timeout_obj;
159-
return mp_call_method_n_kw(1, 0, self->settimeout_args);
163+
mp_call_method_n_kw(1, 0, self->settimeout_args);
160164
}
161165

162-
static int ssl_socket_listen(ssl_sslsocket_obj_t *self, mp_int_t backlog) {
166+
static void ssl_socket_listen(ssl_sslsocket_obj_t *self, mp_int_t backlog) {
163167
self->listen_args[2] = MP_OBJ_NEW_SMALL_INT(backlog);
164-
return call_method_errno(1, self->listen_args);
168+
mp_call_method_n_kw(1, 0, self->listen_args);
165169
}
166170

167171
static mp_obj_t ssl_socket_accept(ssl_sslsocket_obj_t *self) {
@@ -179,13 +183,10 @@ STATIC int _mbedtls_ssl_send(void *ctx, const byte *buf, size_t len) {
179183
if (mp_is_nonblocking_error(err)) {
180184
return MBEDTLS_ERR_SSL_WANT_WRITE;
181185
}
182-
return -err; // convert an MP_ERRNO to something mbedtls passes through as error
183-
} else {
184-
return out_sz;
185186
}
187+
return out_sz;
186188
}
187189

188-
// _mbedtls_ssl_recv is called by mbedtls to receive bytes from the underlying socket
189190
STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
190191
ssl_sslsocket_obj_t *self = (ssl_sslsocket_obj_t *)ctx;
191192

@@ -196,10 +197,8 @@ STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
196197
if (mp_is_nonblocking_error(err)) {
197198
return MBEDTLS_ERR_SSL_WANT_READ;
198199
}
199-
return -err;
200-
} else {
201-
return out_sz;
202200
}
201+
return out_sz;
203202
}
204203

205204

@@ -361,8 +360,8 @@ mp_uint_t common_hal_ssl_sslsocket_send(ssl_sslsocket_obj_t *self, const uint8_t
361360
mbedtls_raise_error(ret);
362361
}
363362

364-
size_t common_hal_ssl_sslsocket_bind(ssl_sslsocket_obj_t *self, mp_obj_t addr_in) {
365-
return ssl_socket_bind(self, addr_in);
363+
void common_hal_ssl_sslsocket_bind(ssl_sslsocket_obj_t *self, mp_obj_t addr_in) {
364+
ssl_socket_bind(self, addr_in);
366365
}
367366

368367
void common_hal_ssl_sslsocket_close(ssl_sslsocket_obj_t *self) {
@@ -426,7 +425,7 @@ bool common_hal_ssl_sslsocket_get_connected(ssl_sslsocket_obj_t *self) {
426425
return !self->closed;
427426
}
428427

429-
bool common_hal_ssl_sslsocket_listen(ssl_sslsocket_obj_t *self, int backlog) {
428+
void common_hal_ssl_sslsocket_listen(ssl_sslsocket_obj_t *self, int backlog) {
430429
return ssl_socket_listen(self, backlog);
431430
}
432431

0 commit comments

Comments
 (0)