Add support for PORT/EPRT FTP commands in lowercase.
Use strncasecmp() instead of huge local implementation to reduce code size. Check space presence after command/code. PR: kern/73034
This commit is contained in:
parent
cd83aa9707
commit
b46d3e21bb
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=179912
@ -270,36 +270,14 @@ ParseFtpPortCommand(struct libalias *la, char *sptr, int dlen)
|
||||
if (dlen < 18)
|
||||
return (0);
|
||||
|
||||
if (strncasecmp("PORT ", sptr, 5))
|
||||
return (0);
|
||||
|
||||
addr = port = octet = 0;
|
||||
state = -4;
|
||||
for (i = 0; i < dlen; i++) {
|
||||
state = 0;
|
||||
for (i = 5; i < dlen; i++) {
|
||||
ch = sptr[i];
|
||||
switch (state) {
|
||||
case -4:
|
||||
if (ch == 'P')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -3:
|
||||
if (ch == 'O')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -2:
|
||||
if (ch == 'R')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -1:
|
||||
if (ch == 'T')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
|
||||
case 0:
|
||||
if (isspace(ch))
|
||||
break;
|
||||
@ -365,37 +343,15 @@ ParseFtpEprtCommand(struct libalias *la, char *sptr, int dlen)
|
||||
if (dlen < 18)
|
||||
return (0);
|
||||
|
||||
if (strncasecmp("EPRT ", sptr, 5))
|
||||
return (0);
|
||||
|
||||
addr = port = octet = 0;
|
||||
delim = '|'; /* XXX gcc -Wuninitialized */
|
||||
state = -4;
|
||||
for (i = 0; i < dlen; i++) {
|
||||
state = 0;
|
||||
for (i = 5; i < dlen; i++) {
|
||||
ch = sptr[i];
|
||||
switch (state) {
|
||||
case -4:
|
||||
if (ch == 'E')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -3:
|
||||
if (ch == 'P')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -2:
|
||||
if (ch == 'R')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -1:
|
||||
if (ch == 'T')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
|
||||
case 0:
|
||||
if (!isspace(ch)) {
|
||||
delim = ch;
|
||||
@ -477,31 +433,15 @@ ParseFtp227Reply(struct libalias *la, char *sptr, int dlen)
|
||||
if (dlen < 17)
|
||||
return (0);
|
||||
|
||||
if (strncmp("227 ", sptr, 4))
|
||||
return (0);
|
||||
|
||||
addr = port = octet = 0;
|
||||
|
||||
state = -3;
|
||||
for (i = 0; i < dlen; i++) {
|
||||
state = 0;
|
||||
for (i = 4; i < dlen; i++) {
|
||||
ch = sptr[i];
|
||||
switch (state) {
|
||||
case -3:
|
||||
if (ch == '2')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -2:
|
||||
if (ch == '2')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -1:
|
||||
if (ch == '7')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
|
||||
case 0:
|
||||
if (ch == '(')
|
||||
state++;
|
||||
@ -564,32 +504,16 @@ ParseFtp229Reply(struct libalias *la, char *sptr, int dlen)
|
||||
if (dlen < 11)
|
||||
return (0);
|
||||
|
||||
if (strncmp("229 ", sptr, 4))
|
||||
return (0);
|
||||
|
||||
port = 0;
|
||||
delim = '|'; /* XXX gcc -Wuninitialized */
|
||||
|
||||
state = -3;
|
||||
for (i = 0; i < dlen; i++) {
|
||||
state = 0;
|
||||
for (i = 4; i < dlen; i++) {
|
||||
ch = sptr[i];
|
||||
switch (state) {
|
||||
case -3:
|
||||
if (ch == '2')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -2:
|
||||
if (ch == '2')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
case -1:
|
||||
if (ch == '9')
|
||||
state++;
|
||||
else
|
||||
return (0);
|
||||
break;
|
||||
|
||||
case 0:
|
||||
if (ch == '(')
|
||||
state++;
|
||||
@ -689,6 +613,7 @@ NewFtpMessage(struct libalias *la, struct ip *pip,
|
||||
|
||||
alias_port = GetAliasPort(ftp_lnk);
|
||||
|
||||
/* Prepare new command */
|
||||
switch (ftp_message_type) {
|
||||
case FTP_PORT_COMMAND:
|
||||
case FTP_227_REPLY:
|
||||
|
Loading…
Reference in New Issue
Block a user