diff options
author | Moonchild <moonchild@palemoon.org> | 2020-01-26 08:26:23 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-26 08:26:23 +0000 |
commit | a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99 (patch) | |
tree | 08495718d2d650a3ce25ee7a39010733685e9299 | |
parent | a64ac6d7022e4c88149d897864f857dce1063249 (diff) | |
parent | 7d53919c26e7b1126d2b0bd534ec7299fc34f040 (diff) | |
download | UXP-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.cpp | 18 | ||||
-rw-r--r-- | netwerk/protocol/ftp/nsFtpConnectionThread.h | 6 |
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; |