summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2024-05-03 23:32:44 +0200
committerUros Majstorovic <majstor@majstor.org>2024-05-03 23:32:44 +0200
commit77c7b4afafa7e1e4b488da64fa6588d2995a956f (patch)
treea8665617fa02fbc4ddb921fb5df95bae5ae350ef
parentb051b3abdc70976cbbe4682141a4b9239f10a8bf (diff)
fixed conn new / key checker interface; fixed memory leak when conn create fails
-rw-r--r--ecp/src/ecp/core.c33
-rw-r--r--ecp/src/ecp/core.h6
2 files changed, 20 insertions, 19 deletions
diff --git a/ecp/src/ecp/core.c b/ecp/src/ecp/core.c
index a049bb7..7d61def 100644
--- a/ecp/src/ecp/core.c
+++ b/ecp/src/ecp/core.c
@@ -912,10 +912,10 @@ static int conn_shkey_set(ECPConnection *conn, unsigned char s_idx, unsigned cha
return ECP_OK;
}
-ECPConnection *ecp_conn_new_inb(ECPSocket *sock, unsigned char ctype) {
+ECPConnection *ecp_conn_new_inb(ECPSocket *sock, ECPConnection *parent, unsigned char ctype) {
ECPContext *ctx = sock->ctx;
- if (ctx->conn_new) return ctx->conn_new(sock, ctype);
+ if (ctx->conn_new) return ctx->conn_new(sock, parent, ctype);
return NULL;
}
@@ -1106,17 +1106,12 @@ int ecp_conn_create_outb(ECPConnection *conn, ECPConnection *parent, ECPNode *no
conn->key[conn->key_curr] = key;
rv = ecp_conn_create(conn, parent);
- if (rv) return rv;
-
- return ECP_OK;
+ return rv;
}
void ecp_conn_destroy(ECPConnection *conn) {
#ifdef ECP_WITH_VCONN
- if (conn->parent) {
- ecp_conn_refcount_dec(conn->parent);
- conn->parent = NULL;
- }
+ if (conn->parent) ecp_conn_refcount_dec(conn->parent);
#endif
ecp_ext_conn_destroy(conn);
@@ -1292,7 +1287,10 @@ int _ecp_conn_open(ECPConnection *conn, ECPConnection *parent, ECPNode *node, in
ssize_t _rv;
rv = ecp_conn_create_outb(conn, parent, node);
- if (rv) return rv;
+ if (rv) {
+ ecp_conn_free(conn);
+ return rv;
+ }
rv = ecp_conn_insert(conn);
if (rv) {
@@ -1894,18 +1892,21 @@ ssize_t ecp_handle_open_req(ECPSocket *sock, ECPConnection *parent, unsigned cha
if (memcmp(vbox_buf, public_buf, ECP_SIZE_ECDH_PUB) != 0) return ECP_ERR_VBOX;
if (memcmp(vbox_buf+ECP_SIZE_ECDH_PUB, &key_curr.public, ECP_SIZE_ECDH_PUB) != 0) return ECP_ERR_VBOX;
rkey_perma.valid = 1;
+ }
- if (sock->ctx->key_checker) {
- _rv = sock->ctx->key_checker(sock, ctype, &rkey_perma.public);
- if (_rv) return _rv;
- }
+ if (sock->ctx->key_checker) {
+ _rv = sock->ctx->key_checker(sock, parent, ctype, rkey_perma.valid ? &rkey_perma.public : NULL);
+ if (!_rv) return ECP_ERR_VBOX;
}
- conn = ecp_conn_new_inb(sock, ctype);
+ conn = ecp_conn_new_inb(sock, parent, ctype);
if (conn == NULL) return ECP_ERR_ALLOC;
_rv = ecp_conn_create_inb(conn, parent, s_idx, c_idx, (ecp_ecdh_public_t *)public_buf, rkey_perma.valid ? &rkey_perma : NULL, shkey);
- if (_rv) return _rv;
+ if (_rv) {
+ ecp_conn_free(conn);
+ return _rv;
+ }
_rv = ecp_conn_insert(conn);
if (_rv) {
diff --git a/ecp/src/ecp/core.h b/ecp/src/ecp/core.h
index 62c1de3..5d8cd47 100644
--- a/ecp/src/ecp/core.h
+++ b/ecp/src/ecp/core.h
@@ -227,9 +227,9 @@ struct ECPFragIter;
typedef int (*ecp_conn_expired_t) (struct ECPConnection *conn, ecp_sts_t now);
typedef void (*ecp_err_handler_t) (struct ECPConnection *conn, unsigned char mtype, int err);
-typedef struct ECPConnection * (*ecp_conn_new_t) (struct ECPSocket *sock, unsigned char type);
+typedef struct ECPConnection * (*ecp_conn_new_t) (struct ECPSocket *sock, struct ECPConnection *parent, unsigned char type);
typedef void (*ecp_conn_free_t) (struct ECPConnection *conn);
-typedef int (*ecp_key_checker_t) (struct ECPSocket *sock, unsigned char ctype, ecp_ecdh_public_t *pub);
+typedef int (*ecp_key_checker_t) (struct ECPSocket *sock, struct ECPConnection *parent, unsigned char ctype, ecp_ecdh_public_t *pub);
typedef ssize_t (*ecp_msg_handler_t) (struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, size_t msg_size, struct ECP2Buffer *b);
typedef int (*ecp_open_handler_t) (struct ECPConnection *conn, struct ECP2Buffer *b);
@@ -401,7 +401,7 @@ void ecp_sock_expire(ECPSocket *sock, ecp_conn_expired_t conn_expired);
void ecp_atag_gen(ECPSocket *sock, unsigned char *public_buf, unsigned char *atag, ecp_nonce_t *nonce);
int ecp_cookie_verify(ECPSocket *sock, unsigned char *cookie, unsigned char *public_buf);
-ECPConnection *ecp_conn_new_inb(ECPSocket *sock, unsigned char ctype);
+ECPConnection *ecp_conn_new_inb(ECPSocket *sock, ECPConnection *parent, unsigned char ctype);
void ecp_conn_init(ECPConnection *conn, ECPSocket *sock, unsigned char ctype);
void ecp_conn_set_flags(ECPConnection *conn, unsigned char flags);
void ecp_conn_clr_flags(ECPConnection *conn, unsigned char flags);