From f7b9b7be960db6e5c05241f69aa5de7073624147 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Sun, 27 Aug 2017 16:57:26 +0200 Subject: [PATCH] tty.c: Free memory for external getty on tty_unregister() Signed-off-by: Joachim Nilsson --- src/tty.c | 15 +++++++++++++-- src/tty.h | 3 ++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/tty.c b/src/tty.c index e73ffb36..37f20596 100644 --- a/src/tty.c +++ b/src/tty.c @@ -108,7 +108,7 @@ int tty_register(char *line, struct timeval *mtime) { tty_node_t *entry; int i, num = 1, insert = 0, noclear = 0; - char *tok, *cmd = NULL, *args[10]; + char *tok, *cmd = NULL, *args[TTY_MAX_ARGS]; char *dev = NULL, *baud = NULL; char *runlevels = NULL, *term = NULL; @@ -137,6 +137,8 @@ int tty_register(char *line, struct timeval *mtime) dev = strdup(tok); args[num++] = strdup(tok); + if (num >= TTY_MAX_ARGS) + break; } cmd = strdup(cmd); @@ -188,7 +190,7 @@ int tty_register(char *line, struct timeval *mtime) /* External getty */ entry->data.cmd = cmd; - for (i = 0; i < num; i++) + for (i = 0; i < num && i < TTY_MAX_ARGS; i++) entry->data.args[i] = args[i]; entry->data.args[++i] = NULL; @@ -217,6 +219,15 @@ int tty_unregister(tty_node_t *tty) free(tty->data.baud); if (tty->data.term) free(tty->data.term); + if (tty->data.cmd) { + int i; + + free(tty->data.cmd); + for (i = 0; tty->data.args[i] && i < TTY_MAX_ARGS; i++) { + free(tty->data.args[i]); + tty->data.args[i] = NULL; + } + } free(tty); return 0; diff --git a/src/tty.h b/src/tty.h index f2091efa..a484aefa 100644 --- a/src/tty.h +++ b/src/tty.h @@ -28,6 +28,7 @@ #include #include /* BSD sys/queue.h API */ +#define TTY_MAX_ARGS 16 #define EVENT_SIZE ((sizeof(struct inotify_event) + NAME_MAX + 1)) typedef struct { @@ -38,7 +39,7 @@ typedef struct { int runlevels; char *cmd; /* NULL when running built-in getty */ - char *args[10]; + char *args[TTY_MAX_ARGS]; int pid; } finit_tty_t;