aboutsummaryrefslogtreecommitdiff
path: root/lib/ftp.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2003-11-10 08:12:53 +0000
committerDaniel Stenberg <daniel@haxx.se>2003-11-10 08:12:53 +0000
commit17a834bc63b2781aefcef1fc2213877053ba1873 (patch)
treea27c5115b1c9b69ceab7ba556b1b6d2d684faa47 /lib/ftp.c
parentc10bc0ef1240518f4fd09519c11414667a4df5f1 (diff)
After Sébastien Willemijns' bug report, we now check the separators properly
in the 229-reply servers respond on a EPSV command and bail out better if the reply string is not valid RFC2428-compliant.
Diffstat (limited to 'lib/ftp.c')
-rw-r--r--lib/ftp.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/lib/ftp.c b/lib/ftp.c
index 0f067c5da..5db4c5fc3 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1389,18 +1389,8 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
*/
-#if 1
const char *mode[] = { "EPSV", "PASV", NULL };
int results[] = { 229, 227, 0 };
-#else
-#if 0
- char *mode[] = { "EPSV", "LPSV", "PASV", NULL };
- int results[] = { 229, 228, 227, 0 };
-#else
- const char *mode[] = { "PASV", NULL };
- int results[] = { 227, 0 };
-#endif
-#endif
int modeoff;
unsigned short connectport; /* the local port connect() should use! */
unsigned short newport=0; /* remote port, not necessary the local one */
@@ -1459,7 +1449,6 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
newhostp = newhost;
newport = (port[0]<<8) + port[1];
}
-#if 1
else if (229 == results[modeoff]) {
char *ptr = strchr(buf, '(');
if(ptr) {
@@ -1472,11 +1461,23 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
&separator[2],
&num,
&separator[3])) {
- /* the four separators should be identical */
- newport = num;
+ char sep1 = separator[0];
+ int i;
- /* we should use the same host we already are connected to */
- newhostp = conn->name;
+ /* The four separators should be identical, or else this is an oddly
+ formatted reply and we bail out immediately. */
+ for(i=1; i<4; i++) {
+ if(separator[i] != sep1) {
+ ptr=NULL; /* set to NULL to signal error */
+ break;
+ }
+ }
+ if(ptr) {
+ newport = num;
+
+ /* we should use the same host we already are connected to */
+ newhostp = conn->name;
+ }
}
else
ptr=NULL;
@@ -1486,7 +1487,6 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
return CURLE_FTP_WEIRD_PASV_REPLY;
}
}
-#endif
else
return CURLE_FTP_CANT_RECONNECT;