From: Li Feng Date: Wed, 21 Jun 2017 05:38:06 +0000 (+0800) Subject: Fix memory leak of 'lxc_tty_state' X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d1ea3f93f6f2cbbb138030cb718603c2d2a6f0aa;p=thirdparty%2Flxc.git Fix memory leak of 'lxc_tty_state' Signed-off-by: Li Feng --- diff --git a/src/lxc/console.c b/src/lxc/console.c index 6a2fc72fd..f77586ca3 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -135,6 +135,7 @@ struct lxc_tty_state *lxc_console_sigwinch_init(int srcfd, int dstfd) if (sigprocmask(SIG_BLOCK, &mask, &ts->oldmask)) { SYSERROR("failed to block SIGWINCH"); ts->sigfd = -1; + lxc_list_del(&ts->node); return ts; } @@ -143,6 +144,7 @@ struct lxc_tty_state *lxc_console_sigwinch_init(int srcfd, int dstfd) SYSERROR("failed to create signal fd"); sigprocmask(SIG_SETMASK, &ts->oldmask, NULL); ts->sigfd = -1; + lxc_list_del(&ts->node); return ts; } @@ -152,11 +154,12 @@ struct lxc_tty_state *lxc_console_sigwinch_init(int srcfd, int dstfd) void lxc_console_sigwinch_fini(struct lxc_tty_state *ts) { - if (ts->sigfd >= 0) + if (ts->sigfd >= 0) { close(ts->sigfd); + lxc_list_del(&ts->node); + sigprocmask(SIG_SETMASK, &ts->oldmask, NULL); + } - lxc_list_del(&ts->node); - sigprocmask(SIG_SETMASK, &ts->oldmask, NULL); free(ts); } @@ -306,7 +309,7 @@ int lxc_setup_tios(int fd, struct termios *oldtios) static void lxc_console_peer_proxy_free(struct lxc_console *console) { - if (console->tty_state && console->tty_state->sigfd != -1) { + if (console->tty_state) { lxc_console_sigwinch_fini(console->tty_state); console->tty_state = NULL; } @@ -747,8 +750,7 @@ int lxc_console(struct lxc_container *c, int ttynum, err4: lxc_mainloop_close(&descr); err3: - if (ts->sigfd != -1) - lxc_console_sigwinch_fini(ts); + lxc_console_sigwinch_fini(ts); err2: close(masterfd); close(ttyfd);