diff options
author | dwmalone <dwmalone@FreeBSD.org> | 2002-01-05 20:13:01 +0000 |
---|---|---|
committer | dwmalone <dwmalone@FreeBSD.org> | 2002-01-05 20:13:01 +0000 |
commit | 7bc655e78562e9bf86dc1e81ca7c633b77f2eb5b (patch) | |
tree | 1210bafc843439829764b1d0b7d5216d02bbb96a /libexec/ftpd | |
parent | 497b03717ce7942264133e7c161fb779f7440fe4 (diff) | |
download | FreeBSD-src-7bc655e78562e9bf86dc1e81ca7c633b77f2eb5b.zip FreeBSD-src-7bc655e78562e9bf86dc1e81ca7c633b77f2eb5b.tar.gz |
Be more careful about freeing memory after parsing commands.
Hiroyuki YAMAMORI gave a patch for the EPRT command in the
PR below. Problems with the rest of the patch are my fault.
PR: 33268
Reviewed by: iedowse, sheldonh
Diffstat (limited to 'libexec/ftpd')
-rw-r--r-- | libexec/ftpd/ftpcmd.y | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/libexec/ftpd/ftpcmd.y b/libexec/ftpd/ftpcmd.y index 381d87c..687e3a0 100644 --- a/libexec/ftpd/ftpcmd.y +++ b/libexec/ftpd/ftpcmd.y @@ -102,7 +102,7 @@ static int cmd_type; static int cmd_form; static int cmd_bytesz; char cbuf[512]; -char *fromname; +char *fromname = (char *) 0; extern int epsvall; @@ -151,6 +151,8 @@ cmd_list : /* empty */ | cmd_list cmd { + if (fromname) + free(fromname); fromname = (char *) 0; restart_point = (off_t) 0; } @@ -313,7 +315,8 @@ cmd if (port_check_v6("EPRT") == 1) goto eprt_done; #endif - eprt_done:; + eprt_done: + free($4); } | PASV check_login CRLF { @@ -559,6 +562,7 @@ cmd help(sitetab, (char *) 0); } else help(cmdtab, $3); + free($3); } | NOOP CRLF { @@ -595,6 +599,7 @@ cmd | SITE SP HELP SP STRING CRLF { help(sitetab, $5); + free($5); } | SITE SP MDFIVE check_login SP pathname CRLF { @@ -607,6 +612,8 @@ cmd else perror_reply(550, $6); } + if ($6) + free($6); } | SITE SP UMASK check_login CRLF { @@ -751,19 +758,24 @@ cmd rcmd : RNFR check_login_ro SP pathname CRLF { - char *renamefrom(); - restart_point = (off_t) 0; if ($2 && $4) { - fromname = renamefrom($4); - if (fromname == (char *) 0 && $4) { + if (fromname) + free(fromname); + fromname = (char *) 0; + if (renamefrom($4)) + fromname = $4; + else free($4); - } + } else if ($4) { + free($4); } } | REST check_login SP byte_size CRLF { if ($2) { + if (fromname) + free(fromname); fromname = (char *) 0; restart_point = $4; /* XXX $4 is only "int" */ reply(350, "Restarting at %qd. %s", |