Skip to content

Commit 9b0bf6e

Browse files
committed
Refactor native.c
1 parent ce0cbe4 commit 9b0bf6e

File tree

1 file changed

+67
-56
lines changed

1 file changed

+67
-56
lines changed

c_src/ex_dtls/native.c

Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@ UNIFEX_TERM handle_regular_read(State *state, char data[], int ret);
2626
UNIFEX_TERM handle_read_error(State *state, int ret);
2727
UNIFEX_TERM handle_handshake_in_progress(State *state, int ret);
2828
UNIFEX_TERM handle_handshake_finished(State *state);
29-
static UnifexPayload **to_payload_array(struct Datagram *dgram_list, int len);
29+
static UnifexPayload **dgram_to_payload_array(struct Datagram *dgram_list,
30+
int len);
3031
static void free_payload_array(UnifexPayload **payloads, int len);
3132

3233
int handle_load(UnifexEnv *env, void **priv_data) {
3334
UNIFEX_UNUSED(env);
3435
UNIFEX_UNUSED(priv_data);
3536

37+
if (OPENSSL_VERSION_NUMBER < 0x30000000L) {
38+
DEBUG("ExDTLS requires OpenSSL 3");
39+
return -1;
40+
}
41+
3642
FILE *urandom = fopen("/dev/urandom", "r");
3743
if (urandom == NULL) {
3844
DEBUG("Cannot open /dev/urandom");
@@ -245,11 +251,11 @@ UNIFEX_TERM get_cert_fingerprint(UnifexEnv *env, UnifexPayload *cert) {
245251
UNIFEX_TERM do_handshake(UnifexEnv *env, State *state) {
246252
SSL_do_handshake(state->ssl);
247253

248-
UnifexPayload **gen_packets;
249-
int gen_packets_size;
254+
UnifexPayload **gen_packets = NULL;
255+
int gen_packets_size = 0;
250256
int ret = read_pending_data(&gen_packets, &gen_packets_size, state);
251257

252-
if (ret == 0 && (gen_packets == NULL || gen_packets_size == 0)) {
258+
if (ret == 0 && gen_packets == NULL) {
253259
return unifex_raise(state->env, "Handshake failed: no packets generated");
254260
} else if (ret < 0) {
255261
return unifex_raise(state->env,
@@ -276,6 +282,8 @@ UNIFEX_TERM write_data(UnifexEnv *env, State *state, UnifexPayload *payload) {
276282
return unifex_raise(env, "Unable to write data");
277283
}
278284

285+
DEBUG("Wrote %d bytes of data", ret);
286+
279287
BIO *wbio = SSL_get_wbio(state->ssl);
280288
size_t pending_data_len = BIO_ctrl_pending(wbio);
281289
if (pending_data_len == 0) {
@@ -286,9 +294,9 @@ UNIFEX_TERM write_data(UnifexEnv *env, State *state, UnifexPayload *payload) {
286294
UnifexPayload **gen_packets = NULL;
287295
int gen_packets_size = 0;
288296
read_pending_data(&gen_packets, &gen_packets_size, state);
289-
if (gen_packets == NULL || gen_packets_size == 0) {
290-
DEBUG("Unable to read data from BIO after writing");
291-
return unifex_raise(env, "Unable to read data from BIO after writing");
297+
if (gen_packets == NULL) {
298+
DEBUG("Couldn't read pending data after writing");
299+
return unifex_raise(env, "Couldn't read pending data after writing");
292300
}
293301

294302
UNIFEX_TERM res_term =
@@ -391,7 +399,8 @@ UNIFEX_TERM handle_handshake_finished(State *state) {
391399

392400
int ret = read_pending_data(&gen_packets, &gen_packets_size, state);
393401
if (ret < 0) {
394-
res_term = unifex_raise(state->env, "Handshake failed: write BIO error");
402+
res_term = unifex_raise(state->env,
403+
"Handshake failed: couldn't read pending data.");
395404
goto cleanup;
396405
}
397406

@@ -429,8 +438,9 @@ UNIFEX_TERM handle_handshake_in_progress(State *state, int ret) {
429438
int read_err = read_pending_data(&gen_packets, &gen_packets_size, state);
430439

431440
if (read_err < 0) {
432-
return unifex_raise(state->env, "Handshake failed: write BIO error");
433-
} else if (read_err == 0 && gen_packets_size == 0) {
441+
return unifex_raise(state->env,
442+
"Handshake failed: couldn't read pending data");
443+
} else if (read_err == 0 && gen_packets == NULL) {
434444
return handle_data_result_handshake_want_read(state->env);
435445
} else {
436446
int timeout = get_timeout(state->ssl);
@@ -455,9 +465,9 @@ UNIFEX_TERM handle_timeout(UnifexEnv *env, State *state) {
455465
int gen_packets_size = 0;
456466
read_pending_data(&gen_packets, &gen_packets_size, state);
457467

458-
if (gen_packets == NULL || gen_packets_size == 0) {
459-
return unifex_raise(state->env,
460-
"Retransmit handshake failed: write BIO error");
468+
if (gen_packets == NULL) {
469+
return unifex_raise(
470+
state->env, "Retransmit handshake failed: couldn't read pending data");
461471
} else {
462472
int timeout = get_timeout(state->ssl);
463473
UNIFEX_TERM res_term = handle_timeout_result_retransmit(
@@ -502,36 +512,6 @@ static int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) {
502512
}
503513
}
504514

505-
static UnifexPayload **to_payload_array(struct Datagram *dgram_list, int len) {
506-
if (len == 0) {
507-
return NULL;
508-
}
509-
510-
UnifexPayload **payloads = calloc(len, sizeof(UnifexPayload *));
511-
512-
struct Datagram *itr = dgram_list;
513-
514-
for (int i = 0; i < len; i++) {
515-
payloads[i] = itr->packet;
516-
itr = itr->next;
517-
}
518-
519-
itr = dgram_list;
520-
struct Datagram *next = dgram_list->next;
521-
522-
if (next == NULL) {
523-
free(itr);
524-
} else {
525-
while (next != NULL) {
526-
free(itr);
527-
itr = next;
528-
next = itr->next;
529-
}
530-
}
531-
532-
return payloads;
533-
}
534-
535515
static int read_pending_data(UnifexPayload ***payloads, int *size,
536516
State *state) {
537517

@@ -595,10 +575,53 @@ static int read_pending_data(UnifexPayload ***payloads, int *size,
595575
(*size)++;
596576
}
597577

598-
*payloads = to_payload_array(dgram_list, *size);
578+
*payloads = dgram_to_payload_array(dgram_list, *size);
599579
return 0;
600580
}
601581

582+
static UnifexPayload **dgram_to_payload_array(struct Datagram *dgram_list,
583+
int len) {
584+
if (len == 0) {
585+
return NULL;
586+
}
587+
588+
UnifexPayload **payloads = calloc(len, sizeof(UnifexPayload *));
589+
590+
struct Datagram *itr = dgram_list;
591+
592+
for (int i = 0; i < len; i++) {
593+
payloads[i] = itr->packet;
594+
itr = itr->next;
595+
}
596+
597+
itr = dgram_list;
598+
struct Datagram *next = dgram_list->next;
599+
600+
if (next == NULL) {
601+
free(itr);
602+
} else {
603+
while (next != NULL) {
604+
free(itr);
605+
itr = next;
606+
next = itr->next;
607+
}
608+
}
609+
610+
return payloads;
611+
}
612+
613+
static void free_payload_array(UnifexPayload **payloads, int len) {
614+
if (payloads == NULL) {
615+
return;
616+
}
617+
618+
for (int i = 0; i < len; i++) {
619+
unifex_payload_release(payloads[i]);
620+
free(payloads[i]);
621+
}
622+
free(payloads);
623+
}
624+
602625
static void cert_to_payload(UnifexEnv *env, X509 *x509,
603626
UnifexPayload *payload) {
604627
int len = i2d_X509(x509, NULL);
@@ -617,18 +640,6 @@ static void pkey_to_payload(UnifexEnv *env, EVP_PKEY *pkey,
617640
payload->size = len;
618641
}
619642

620-
static void free_payload_array(UnifexPayload **payloads, int len) {
621-
if (payloads == NULL) {
622-
return;
623-
}
624-
625-
for (int i = 0; i < len; i++) {
626-
unifex_payload_release(payloads[i]);
627-
free(payloads[i]);
628-
}
629-
free(payloads);
630-
}
631-
632643
void handle_destroy_state(UnifexEnv *env, State *state) {
633644
UNIFEX_UNUSED(env);
634645
DEBUG("Destroying state");

0 commit comments

Comments
 (0)