diff options
| author | Damien Miller <djm@mindrot.org> | 2012-07-06 13:44:43 +1000 |
|---|---|---|
| committer | Damien Miller <djm@mindrot.org> | 2012-07-06 13:44:43 +1000 |
| commit | ab523b02467f36a2f85c1a8bff6cf2fd4297fb12 (patch) | |
| tree | e8944e6d41815baeb1502138a38723fcbda36870 /mux.c | |
| parent | dfceafe8b11a4a1f9890a37e0cd88b01eb9cc30c (diff) | |
| download | platform_external_openssh-ab523b02467f36a2f85c1a8bff6cf2fd4297fb12.tar.gz platform_external_openssh-ab523b02467f36a2f85c1a8bff6cf2fd4297fb12.tar.bz2 platform_external_openssh-ab523b02467f36a2f85c1a8bff6cf2fd4297fb12.zip | |
- djm@cvs.openbsd.org 2012/07/06 01:37:21
[mux.c]
fix memory leak of passed-in environment variables and connection
context when new session message is malformed; bz#2003 from Bert.Wesarg
AT googlemail.com
Diffstat (limited to 'mux.c')
| -rw-r--r-- | mux.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -1,4 +1,4 @@ -/* $OpenBSD: mux.c,v 1.35 2012/06/01 01:01:22 djm Exp $ */ +/* $OpenBSD: mux.c,v 1.36 2012/07/06 01:37:21 djm Exp $ */ /* * Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org> * @@ -316,6 +316,8 @@ process_mux_new_session(u_int rid, Channel *c, Buffer *m, Buffer *r) cctx->term = NULL; cctx->rid = rid; cmd = reserved = NULL; + cctx->env = NULL; + env_len = 0; if ((reserved = buffer_get_string_ret(m, NULL)) == NULL || buffer_get_int_ret(&cctx->want_tty, m) != 0 || buffer_get_int_ret(&cctx->want_x_fwd, m) != 0 || @@ -329,16 +331,19 @@ process_mux_new_session(u_int rid, Channel *c, Buffer *m, Buffer *r) xfree(cmd); if (reserved != NULL) xfree(reserved); + for (j = 0; j < env_len; j++) + xfree(cctx->env[j]); + if (env_len > 0) + xfree(cctx->env); if (cctx->term != NULL) xfree(cctx->term); + xfree(cctx); error("%s: malformed message", __func__); return -1; } xfree(reserved); reserved = NULL; - cctx->env = NULL; - env_len = 0; while (buffer_len(m) > 0) { #define MUX_MAX_ENV_VARS 4096 if ((cp = buffer_get_string_ret(m, &len)) == NULL) @@ -413,6 +418,7 @@ process_mux_new_session(u_int rid, Channel *c, Buffer *m, Buffer *r) xfree(cctx->env); } buffer_free(&cctx->cmd); + xfree(cctx); return 0; } |
