aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES5
-rw-r--r--lib/ftp.c34
2 files changed, 39 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index ea017b8bb..3231bcaf2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,11 @@
Changelog
+Daniel (12 January 2006)
+- Michael Jahn fixed PROXYTUNNEL to work fine when you do ftp through a proxy.
+ It would previously overwrite internal memory and cause unpredicted
+ behaviour!
+
Daniel (11 January 2006)
- I decided to document the "secret option" here now, as I've received *NO*
feedback at all on my mailing list requests from November 2005:
diff --git a/lib/ftp.c b/lib/ftp.c
index 6bf96cde9..ad4989968 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1675,7 +1675,22 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
/* BLOCKING */
/* We want "seamless" FTP operations through HTTP proxy tunnel */
+
+ /* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member
+ * conn->proto.http; we want FTP through HTTP and we have to change the
+ * member temporarily for connecting to the HTTP proxy. After
+ * Curl_proxyCONNECT we have to set back the member to the original struct
+ * FTP pointer
+ */
+ struct HTTP http_proxy;
+ struct FTP *ftp_save = conn->proto.ftp;
+ memset(&http_proxy, 0, sizeof(http_proxy));
+ conn->proto.http = &http_proxy;
+
result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport);
+
+ conn->proto.ftp = ftp_save;
+
if(CURLE_OK != result)
return result;
}
@@ -2726,6 +2741,11 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
{
struct FTP *ftp;
CURLcode result;
+#ifndef CURL_DISABLE_HTTP
+ /* for FTP over HTTP proxy */
+ struct HTTP http_proxy;
+ struct FTP *ftp_save;
+#endif /* CURL_DISABLE_HTTP */
*done = FALSE; /* default to not done yet */
@@ -2753,8 +2773,22 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
if (conn->bits.tunnel_proxy) {
/* BLOCKING */
/* We want "seamless" FTP operations through HTTP proxy tunnel */
+
+ /* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member
+ * conn->proto.http; we want FTP through HTTP and we have to change the
+ * member temporarily for connecting to the HTTP proxy. After
+ * Curl_proxyCONNECT we have to set back the member to the original struct
+ * FTP pointer
+ */
+ ftp_save = conn->proto.ftp;
+ memset(&http_proxy, 0, sizeof(http_proxy));
+ conn->proto.http = &http_proxy;
+
result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
conn->host.name, conn->remote_port);
+
+ conn->proto.ftp = ftp_save;
+
if(CURLE_OK != result)
return result;
}