summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2008-06-21 16:22:56 +0000
committermav <mav@FreeBSD.org>2008-06-21 16:22:56 +0000
commitd3bd62e8051581bfc33d309594ddb5c7cf8e2c79 (patch)
tree84f4b3ddabc7070f8e96e66da5a3a40ae8e2b8f7
parent58967561b930a3295172a6290e459247c1765cf9 (diff)
downloadFreeBSD-src-d3bd62e8051581bfc33d309594ddb5c7cf8e2c79.zip
FreeBSD-src-d3bd62e8051581bfc33d309594ddb5c7cf8e2c79.tar.gz
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
-rw-r--r--sys/netinet/libalias/alias_ftp.c117
1 files changed, 21 insertions, 96 deletions
diff --git a/sys/netinet/libalias/alias_ftp.c b/sys/netinet/libalias/alias_ftp.c
index b90fd9f..243dfae 100644
--- a/sys/netinet/libalias/alias_ftp.c
+++ b/sys/netinet/libalias/alias_ftp.c
@@ -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:
OpenPOWER on IntegriCloud