]> git.meshlink.io Git - meshlink/blobdiff - src/protocol.c
Fix potential NULL pointer dereference.
[meshlink] / src / protocol.c
index c8c75cfc4714b0a7c15f62c4491ebfbd0054edc1..39f529a268045ef78a1956a1970380dc440c719e 100644 (file)
@@ -42,7 +42,7 @@ static bool (*request_handlers[])(meshlink_handle_t *, connection_t *, const cha
 
 /* Request names */
 
-static char (*request_name[]) = {
+static const char *request_name[] = {
        "ID", "METAKEY", "CHALLENGE", "CHAL_REPLY", "ACK",
        "STATUS", "ERROR", "TERMREQ",
        "PING", "PONG",
@@ -66,11 +66,15 @@ bool check_id(const char *id) {
 /* Generic request routines - takes care of logging and error
    detection as well */
 
-bool send_request(meshlink_handle_t *mesh, connection_t *c, submesh_t *s, const char *format, ...) {
-       assert(c);
+bool send_request(meshlink_handle_t *mesh, connection_t *c, const submesh_t *s, const char *format, ...) {
        assert(format);
        assert(*format);
 
+       if(!c) {
+               logger(mesh, MESHLINK_ERROR, "Trying to send request to non-existing connection");
+               return false;
+       }
+
        va_list args;
        char request[MAXBUFSIZE];
        int len;
@@ -106,7 +110,7 @@ bool send_request(meshlink_handle_t *mesh, connection_t *c, submesh_t *s, const
        }
 }
 
-void forward_request(meshlink_handle_t *mesh, connection_t *from, submesh_t *s, const char *request) {
+void forward_request(meshlink_handle_t *mesh, connection_t *from, const submesh_t *s, const char *request) {
        assert(from);
        assert(request);
        assert(*request);
@@ -140,7 +144,7 @@ bool receive_request(meshlink_handle_t *mesh, connection_t *c, const char *reque
                        logger(mesh, MESHLINK_DEBUG, "Got %s from %s: %s", request_name[reqno], c->name, request);
                }
 
-               if((c->allow_request != ALL) && (c->allow_request != reqno)) {
+               if((c->allow_request != ALL) && (c->allow_request != reqno) && (reqno != ERROR)) {
                        logger(mesh, MESHLINK_ERROR, "Unauthorized request from %s", c->name);
                        return false;
                }
@@ -180,7 +184,7 @@ static void age_past_requests(event_loop_t *loop, void *data) {
 
        for splay_each(past_request_t, p, mesh->past_request_tree) {
                if(p->firstseen + request_timeout <= mesh->loop.now.tv_sec) {
-                       splay_delete_node(mesh->past_request_tree, node), deleted++;
+                       splay_delete_node(mesh->past_request_tree, splay_node), deleted++;
                } else {
                        left++;
                }