From 1bfcbaf5dd86a343c15002d50e39fa074afe40e0 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sat, 1 Nov 2014 14:24:00 +0100 Subject: [PATCH] Add argument validation to the channels API. --- src/meshlink.c | 41 ++++++++++++++++++++++++++++++++++++++--- src/utcp | 2 +- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/meshlink.c b/src/meshlink.c index 82666332..8f0ae7d2 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -1964,6 +1964,11 @@ static ssize_t channel_send(struct utcp *utcp, const void *data, size_t len) { } void meshlink_set_channel_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, meshlink_channel_receive_cb_t cb) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + channel->receive_cb = cb; } @@ -1993,6 +1998,11 @@ void meshlink_set_channel_poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *c } void meshlink_set_channel_accept_cb(meshlink_handle_t *mesh, meshlink_channel_accept_cb_t cb) { + if(!mesh) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + pthread_mutex_lock(&mesh->mesh_mutex); mesh->channel_accept_cb = cb; mesh->receive_cb = channel_receive; @@ -2005,10 +2015,12 @@ void meshlink_set_channel_accept_cb(meshlink_handle_t *mesh, meshlink_channel_ac pthread_mutex_unlock(&mesh->mesh_mutex); } -void meshlink_channel_init(meshlink_handle_t *mesh) { -} - meshlink_channel_t *meshlink_channel_open(meshlink_handle_t *mesh, meshlink_node_t *node, uint16_t port, meshlink_channel_receive_cb_t cb, const void *data, size_t len) { + if(!mesh || !node) { + meshlink_errno = MESHLINK_EINVAL; + return NULL; + } + logger(mesh, MESHLINK_WARNING, "meshlink_channel_open(%p, %s, %u, %p, %p, %zu)\n", mesh, node->name, port, cb, data, len); node_t *n = (node_t *)node; if(!n->utcp) { @@ -2032,15 +2044,38 @@ meshlink_channel_t *meshlink_channel_open(meshlink_handle_t *mesh, meshlink_node } void meshlink_channel_shutdown(meshlink_handle_t *mesh, meshlink_channel_t *channel, int direction) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + utcp_shutdown(channel->c, direction); } void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *channel) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + utcp_close(channel->c); free(channel); } ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return -1; + } + + if(!len) + return 0; + + if(!data) { + meshlink_errno = MESHLINK_EINVAL; + return -1; + } + // TODO: locking. // Ideally we want to put the data into the UTCP connection's send buffer. // Then, preferrably only if there is room in the receiver window, diff --git a/src/utcp b/src/utcp index 52eeda5e..8d8944f2 160000 --- a/src/utcp +++ b/src/utcp @@ -1 +1 @@ -Subproject commit 52eeda5e47e8a081cd2f94b78536c6376592a526 +Subproject commit 8d8944f2e16b8d11e54cb79e1d45023e84aed37f -- 2.39.5