summaryrefslogtreecommitdiff
path: root/libexec/ftpd
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/ftpd')
-rw-r--r--libexec/ftpd/ftpcmd.y194
1 files changed, 110 insertions, 84 deletions
diff --git a/libexec/ftpd/ftpcmd.y b/libexec/ftpd/ftpcmd.y
index 276fb93eff3..4237278973d 100644
--- a/libexec/ftpd/ftpcmd.y
+++ b/libexec/ftpd/ftpcmd.y
@@ -155,85 +155,96 @@ cmd
memset($3, 0, strlen($3));
free($3);
}
- | PORT SP host_port CRLF
+ | PORT check_login SP host_port CRLF
{
- usedefault = 0;
- if (pdata >= 0) {
- (void) close(pdata);
- pdata = -1;
+ if ($2) {
+ usedefault = 0;
+ if (pdata >= 0) {
+ (void) close(pdata);
+ pdata = -1;
+ }
+ reply(200, "PORT command successful.");
}
- reply(200, "PORT command successful.");
}
- | PASV CRLF
+ | PASV check_login CRLF
{
- passive();
+ if ($2) {
+ passive();
+ }
}
- | TYPE SP type_code CRLF
+ | TYPE check_login SP type_code CRLF
{
- switch (cmd_type) {
+ if ($2) {
+ switch (cmd_type) {
- case TYPE_A:
- if (cmd_form == FORM_N) {
- reply(200, "Type set to A.");
- type = cmd_type;
- form = cmd_form;
- } else
- reply(504, "Form must be N.");
- break;
+ case TYPE_A:
+ if (cmd_form == FORM_N) {
+ reply(200, "Type set to A.");
+ type = cmd_type;
+ form = cmd_form;
+ } else
+ reply(504, "Form must be N.");
+ break;
- case TYPE_E:
- reply(504, "Type E not implemented.");
- break;
+ case TYPE_E:
+ reply(504, "Type E not implemented.");
+ break;
+
+ case TYPE_I:
+ reply(200, "Type set to I.");
+ type = cmd_type;
+ break;
- case TYPE_I:
- reply(200, "Type set to I.");
- type = cmd_type;
- break;
+ case TYPE_L:
+ if (cmd_bytesz == 8) {
+ reply(200,
+ "Type set to L (byte size 8).");
+ type = cmd_type;
+ } else
+ reply(504, "Byte size must be 8.");
- case TYPE_L:
-#if NBBY == 8
- if (cmd_bytesz == 8) {
- reply(200,
- "Type set to L (byte size 8).");
- type = cmd_type;
- } else
- reply(504, "Byte size must be 8.");
-#else /* NBBY == 8 */
- UNIMPLEMENTED for NBBY != 8
-#endif /* NBBY == 8 */
+ }
}
}
- | STRU SP struct_code CRLF
+ | STRU check_login SP struct_code CRLF
{
- switch ($3) {
+ if ($2) {
+ switch ($4) {
- case STRU_F:
- reply(200, "STRU F ok.");
- break;
+ case STRU_F:
+ reply(200, "STRU F ok.");
+ break;
- default:
- reply(504, "Unimplemented STRU type.");
+ default:
+ reply(504, "Unimplemented STRU type.");
+ }
}
}
- | MODE SP mode_code CRLF
+ | MODE check_login SP mode_code CRLF
{
- switch ($3) {
+ if ($2) {
+ switch ($4) {
- case MODE_S:
- reply(200, "MODE S ok.");
- break;
+ case MODE_S:
+ reply(200, "MODE S ok.");
+ break;
- default:
- reply(502, "Unimplemented MODE type.");
+ default:
+ reply(502, "Unimplemented MODE type.");
+ }
}
}
- | ALLO SP NUMBER CRLF
+ | ALLO check_login SP NUMBER CRLF
{
- reply(202, "ALLO command ignored.");
+ if ($2) {
+ reply(202, "ALLO command ignored.");
+ }
}
- | ALLO SP NUMBER SP R SP NUMBER CRLF
+ | ALLO check_login SP NUMBER SP R SP NUMBER CRLF
{
- reply(202, "ALLO command ignored.");
+ if ($2) {
+ reply(202, "ALLO command ignored.");
+ }
}
| RETR check_login SP pathname CRLF
{
@@ -287,9 +298,10 @@ cmd
if ($4 != NULL)
free($4);
}
- | STAT CRLF
+ | STAT check_login CRLF
{
- statcmd();
+ if ($2)
+ statcmd();
}
| DELE check_login SP pathname CRLF
{
@@ -298,20 +310,24 @@ cmd
if ($4 != NULL)
free($4);
}
- | RNTO SP pathname CRLF
+ | RNTO check_login SP pathname CRLF
{
- if (fromname) {
- renamecmd(fromname, $3);
- free(fromname);
- fromname = (char *) 0;
- } else {
- reply(503, "Bad sequence of commands.");
+ if ($2) {
+ if (fromname) {
+ renamecmd(fromname, $4);
+ free(fromname);
+ fromname = (char *) 0;
+ } else {
+ reply(503,
+ "Bad sequence of commands.");
+ }
}
- free($3);
+ free($4);
}
- | ABOR CRLF
+ | ABOR check_login CRLF
{
- reply(225, "ABOR command successful.");
+ if ($2)
+ reply(225, "ABOR command successful.");
}
| CWD check_login CRLF
{
@@ -419,24 +435,27 @@ cmd
if ($8 != NULL)
free($8);
}
- | SITE SP IDLE CRLF
+ | SITE SP check_login IDLE CRLF
{
- reply(200,
- "Current IDLE time limit is %d seconds; max %d",
+ if ($3)
+ reply(200,
+ "Current IDLE time limit is %d seconds; max %d",
timeout, maxtimeout);
}
- | SITE SP IDLE SP NUMBER CRLF
+ | SITE SP IDLE check_login SP NUMBER CRLF
{
- if ($5 < 30 || $5 > maxtimeout) {
+ if ($4) {
+ if ($6 < 30 || $6 > maxtimeout) {
reply(501,
- "Maximum IDLE time must be between 30 and %d seconds",
+ "Maximum IDLE time must be between 30 and %d seconds",
maxtimeout);
- } else {
- timeout = $5;
- (void) alarm((unsigned) timeout);
- reply(200,
- "Maximum IDLE time set to %d seconds",
- timeout);
+ } else {
+ timeout = $6;
+ (void) alarm((unsigned) timeout);
+ reply(200,
+ "Maximum IDLE time set to %d seconds",
+ timeout);
+ }
}
}
| STOU check_login SP pathname CRLF
@@ -446,8 +465,9 @@ cmd
if ($4 != NULL)
free($4);
}
- | SYST CRLF
+ | SYST check_login CRLF
{
+ if ($2)
#ifdef unix
#ifdef BSD
reply(215, "UNIX Type: L%d Version: BSD-%d",
@@ -527,14 +547,20 @@ rcmd
if (fromname == (char *) 0 && $4) {
free($4);
}
+ } else {
+ if ($4)
+ free ($4);
}
}
- | REST SP byte_size CRLF
+
+ | REST check_login SP byte_size CRLF
{
- fromname = (char *) 0;
- restart_point = $3; /* XXX $3 is only "int" */
- reply(350, "Restarting at %qd. %s", restart_point,
- "Send STORE or RETRIEVE to initiate transfer.");
+ if ($2) {
+ fromname = (char *) 0;
+ restart_point = $4; /* XXX $4 is only "int" */
+ reply(350, "Restarting at %qd. %s", restart_point,
+ "Send STORE or RETRIEVE to initiate transfer.");
+ }
}
;