summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorShane Kearns <shane.kearns@accenture.com>2011-10-18 15:18:06 (GMT)
committerShane Kearns <shane.kearns@accenture.com>2011-10-18 16:32:48 (GMT)
commit72bf6105214bfc26cff33632f7f4bdeed9cdf362 (patch)
tree6b44674879d9a30a81a50f1c9dad6ba4ed64a5a6 /src/network
parentc9ae5814eb40acdb683004277573a09c6b78aba9 (diff)
downloadQt-72bf6105214bfc26cff33632f7f4bdeed9cdf362.zip
Qt-72bf6105214bfc26cff33632f7f4bdeed9cdf362.tar.gz
Qt-72bf6105214bfc26cff33632f7f4bdeed9cdf362.tar.bz2
FTP - fix interoperability issues with SIZE command
Certain FTP servers refuse the SIZE command in ASCII mode (proftpd) or refuse the SIZE command in ASCII mode for large files. This is a security feature, as the SIZE command requires reading the whole file and counting line ends which can cause denial of services. In binary mode, the file size on disc is reported, which is a relatively quick operation. Qt had two problems here: 1. when size command fails, the total size was reported as -1, whereas the documentation of QFtp::dataTransferProgress states it should be reported as 0 (so that QProgressDialog can display a wait note rather than progress bar) 2. SIZE command was sent before setting the type of the transfer to ASCII / Binary. This is a problem as the size reported by the server is incorrect. Also it usually means sending ASCII SIZE for Binary transfers, which results in the 550 error on FTP servers with DOS protection. Task-Number: QTTH-1428 Reviewed-By: Peter Hartmann
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/qftp.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/network/access/qftp.cpp b/src/network/access/qftp.cpp
index 50a3b1e..eccfea6 100644
--- a/src/network/access/qftp.cpp
+++ b/src/network/access/qftp.cpp
@@ -1851,11 +1851,11 @@ int QFtp::cd(const QString &dir)
int QFtp::get(const QString &file, QIODevice *dev, TransferType type)
{
QStringList cmds;
- cmds << QLatin1String("SIZE ") + file + QLatin1String("\r\n");
if (type == Binary)
cmds << QLatin1String("TYPE I\r\n");
else
cmds << QLatin1String("TYPE A\r\n");
+ cmds << QLatin1String("SIZE ") + file + QLatin1String("\r\n");
cmds << QLatin1String(d_func()->transferMode == Passive ? "PASV\r\n" : "PORT\r\n");
cmds << QLatin1String("RETR ") + file + QLatin1String("\r\n");
return d_func()->addCommand(new QFtpCommand(Get, cmds, dev));
@@ -2336,7 +2336,7 @@ void QFtpPrivate::_q_piError(int errorCode, const QString &text)
// non-fatal errors
if (c->command == QFtp::Get && pi.currentCommand().startsWith(QLatin1String("SIZE "))) {
- pi.dtp.setBytesTotal(-1);
+ pi.dtp.setBytesTotal(0);
return;
} else if (c->command==QFtp::Put && pi.currentCommand().startsWith(QLatin1String("ALLO "))) {
return;