]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Explicitly set the stack size for the MeshLink thread.
[meshlink] / src / meshlink.c
index 14ff7155888c96a04ff33945dfd71dcf9e4481dd..22f5220d4beebe6c19d6612d45923602e0e78061 100644 (file)
@@ -1659,7 +1659,12 @@ bool meshlink_start(meshlink_handle_t *mesh) {
 
        event_loop_start(&mesh->loop);
 
-       if(pthread_create(&mesh->thread, NULL, meshlink_main_loop, mesh) != 0) {
+       // Ensure we have a decent amount of stack space. Musl's default of 80 kB is too small.
+       pthread_attr_t attr;
+       pthread_attr_init(&attr);
+       pthread_attr_setstacksize(&attr, 1024 * 1024);
+
+       if(pthread_create(&mesh->thread, &attr, meshlink_main_loop, mesh) != 0) {
                logger(mesh, MESHLINK_DEBUG, "Could not start thread: %s\n", strerror(errno));
                memset(&mesh->thread, 0, sizeof(mesh)->thread);
                meshlink_errno = MESHLINK_EINTERNAL;
@@ -3675,6 +3680,11 @@ static void channel_poll(struct utcp_connection *connection, size_t len) {
                if(aio->data) {
                        sent = utcp_send(connection, (char *)aio->data + aio->done, todo);
                } else {
+                       /* Limit the amount we read at once to avoid stack overflows */
+                       if(todo > 65536) {
+                               todo = 65536;
+                       }
+
                        char buf[todo];
                        ssize_t result = read(aio->fd, buf, todo);