summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2020-01-26 08:26:23 +0000
committerGitHub <noreply@github.com>2020-01-26 08:26:23 +0000
commita1cce3b2b00bbd9f4983013ddd8934a7bccb9e99 (patch)
tree08495718d2d650a3ce25ee7a39010733685e9299
parenta64ac6d7022e4c88149d897864f857dce1063249 (diff)
parent7d53919c26e7b1126d2b0bd534ec7299fc34f040 (diff)
downloadUXP-a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99.tar
UXP-a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99.tar.gz
UXP-a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99.tar.lz
UXP-a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99.tar.xz
UXP-a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99.zip
Merge pull request #1371 from athenian200/ftp-list
Potential hang on bad FTP sequence
-rw-r--r--netwerk/protocol/ftp/nsFtpConnectionThread.cpp18
-rw-r--r--netwerk/protocol/ftp/nsFtpConnectionThread.h6
2 files changed, 20 insertions, 4 deletions
diff --git a/netwerk/protocol/ftp/nsFtpConnectionThread.cpp b/netwerk/protocol/ftp/nsFtpConnectionThread.cpp
index 0dae7ca92..6904bc33b 100644
--- a/netwerk/protocol/ftp/nsFtpConnectionThread.cpp
+++ b/netwerk/protocol/ftp/nsFtpConnectionThread.cpp
@@ -82,6 +82,9 @@ nsFtpState::nsFtpState()
, mAnonymous(true)
, mRetryPass(false)
, mStorReplyReceived(false)
+ , mRlist1xxReceived(false)
+ , mRstor1xxReceived(false)
+ , mRretr1xxReceived(false)
, mInternalError(NS_OK)
, mReconnectAndLoginAgain(false)
, mCacheConnection(true)
@@ -1153,15 +1156,18 @@ nsFtpState::S_list() {
FTP_STATE
nsFtpState::R_list() {
if (mResponseCode/100 == 1) {
+ mRlist1xxReceived = true;
+
// OK, time to start reading from the data connection.
if (mDataStream && HasPendingCallback())
mDataStream->AsyncWait(this, 0, 0, CallbackTarget());
return FTP_READ_BUF;
}
- if (mResponseCode/100 == 2) {
+ if (mResponseCode/100 == 2 && mRlist1xxReceived) {
//(DONE)
mNextState = FTP_COMPLETE;
+ mRlist1xxReceived = false;
return FTP_COMPLETE;
}
return FTP_ERROR;
@@ -1181,13 +1187,16 @@ nsFtpState::S_retr() {
FTP_STATE
nsFtpState::R_retr() {
- if (mResponseCode/100 == 2) {
+ if (mResponseCode/100 == 2 && mRretr1xxReceived) {
//(DONE)
mNextState = FTP_COMPLETE;
+ mRretr1xxReceived = false;
return FTP_COMPLETE;
}
if (mResponseCode/100 == 1) {
+ mRretr1xxReceived = true;
+
if (mDataStream && HasPendingCallback())
mDataStream->AsyncWait(this, 0, 0, CallbackTarget());
return FTP_READ_BUF;
@@ -1262,7 +1271,7 @@ nsFtpState::S_stor() {
FTP_STATE
nsFtpState::R_stor() {
- if (mResponseCode/100 == 2) {
+ if (mResponseCode/100 == 2 && mRstor1xxReceived) {
//(DONE)
mNextState = FTP_COMPLETE;
mStorReplyReceived = true;
@@ -1270,11 +1279,12 @@ nsFtpState::R_stor() {
// Call Close() if it was not called in nsFtpState::OnStoprequest()
if (!mUploadRequest && !IsClosed())
Close();
-
+ mRstor1xxReceived = false;
return FTP_COMPLETE;
}
if (mResponseCode/100 == 1) {
+ mRstor1xxReceived = true;
LOG(("FTP:(%x) writing on DT\n", this));
return FTP_READ_BUF;
}
diff --git a/netwerk/protocol/ftp/nsFtpConnectionThread.h b/netwerk/protocol/ftp/nsFtpConnectionThread.h
index b4e71bd10..2fe21ab8c 100644
--- a/netwerk/protocol/ftp/nsFtpConnectionThread.h
+++ b/netwerk/protocol/ftp/nsFtpConnectionThread.h
@@ -180,6 +180,12 @@ private:
bool mRetryPass; // retrying the password
bool mStorReplyReceived; // FALSE if waiting for STOR
// completion status from server
+ bool mRlist1xxReceived; // TRUE if the server has sent a
+ // LIST 1xx response.
+ bool mRstor1xxReceived; // TRUE if the server has sent a
+ // STOR 1xx response.
+ bool mRretr1xxReceived; // TRUE if the server has sent a
+ // RETR 1xx response.
nsresult mInternalError; // represents internal state errors
bool mReconnectAndLoginAgain;
bool mCacheConnection;