From c4deb81f31fa64ebcfd4c46ef6f6b583c12d1521 Mon Sep 17 00:00:00 2001 From: yar Date: Thu, 29 Aug 2002 09:23:08 +0000 Subject: Fix lexer jam on unimplemented commands. Submitted by: maxim MFC after: 5 days --- libexec/ftpd/ftpcmd.y | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'libexec') diff --git a/libexec/ftpd/ftpcmd.y b/libexec/ftpd/ftpcmd.y index 6f038be..ec11dcd 100644 --- a/libexec/ftpd/ftpcmd.y +++ b/libexec/ftpd/ftpcmd.y @@ -136,7 +136,7 @@ extern int epsvall; UMASK IDLE CHMOD MDFIVE - LEXERR + LEXERR NOTIMPL %token STRING %token NUMBER @@ -145,7 +145,7 @@ extern int epsvall; %type check_login_ro check_login_epsv %type struct_code mode_code type_code form_code %type pathstring pathname password username -%type ALL +%type ALL NOTIMPL %start cmd_list @@ -752,11 +752,15 @@ cmd reply(221, "Goodbye."); dologout(0); } + | NOTIMPL + { + nack($1); + } | error { yyclearin; /* discard lookahead data */ yyerrok; /* clear error condition */ - state = 0; /* reset lexer state */ + state = CMD; /* reset lexer state */ } ; rcmd @@ -1289,12 +1293,10 @@ yylex(void) p = lookup(cmdtab, cbuf); cbuf[cpos] = c; if (p != 0) { - if (p->implemented == 0) { - nack(p->name); - return (LEXERR); - } - state = p->state; yylval.s = p->name; + if (!p->implemented) + return (NOTIMPL); /* state remains CMD */ + state = p->state; return (p->token); } break; @@ -1313,13 +1315,12 @@ yylex(void) p = lookup(sitetab, cp); cbuf[cpos] = c; if (guest == 0 && p != 0) { - if (p->implemented == 0) { + yylval.s = p->name; + if (!p->implemented) { state = CMD; - nack(p->name); - return (LEXERR); + return (NOTIMPL); } state = p->state; - yylval.s = p->name; return (p->token); } state = CMD; -- cgit v1.1