diff --git a/src/protocol.c b/src/protocol.c index 1be0a4e0..038b4aaa 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -87,9 +87,14 @@ static bool check_host_origin(struct lws *wsi) { return len > 0 && strcasecmp(buf, host_buf) == 0; } +static void close_cb(uv_handle_t *handle) { + struct pty_proc *proc = container_of((uv_pipe_t *)handle, struct pty_proc, pipe); + free(proc); +} + static void pty_proc_free(struct pty_proc *proc) { uv_read_stop((uv_stream_t *)&proc->pipe); - uv_close((uv_handle_t *)&proc->pipe, NULL); + uv_close((uv_handle_t *)&proc->pipe, close_cb); close(proc->pty); @@ -101,8 +106,6 @@ static void pty_proc_free(struct pty_proc *proc) { for (int i = 0; i < proc->argc; i++) { free(proc->args[i]); } - - free(proc); } static void alloc_cb(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { diff --git a/src/utils.h b/src/utils.h index 935bec46..2060ac91 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1,6 +1,12 @@ #ifndef TTYD_UTIL_H #define TTYD_UTIL_H +#define container_of(ptr, type, member) \ + ({ \ + const typeof(((type *)0)->member) *__mptr = (ptr); \ + (type *)((char *)__mptr - offsetof(type, member)); \ + }) + // malloc with NULL check void *xmalloc(size_t size);