diff options
author | mav <mav@FreeBSD.org> | 2008-06-21 16:22:56 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2008-06-21 16:22:56 +0000 |
commit | d3bd62e8051581bfc33d309594ddb5c7cf8e2c79 (patch) | |
tree | 84f4b3ddabc7070f8e96e66da5a3a40ae8e2b8f7 /sys/netinet | |
parent | 58967561b930a3295172a6290e459247c1765cf9 (diff) | |
download | FreeBSD-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
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/libalias/alias_ftp.c | 117 |
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: |