diff options
author | V3n3RiX <venerix@redcorelinux.org> | 2018-06-23 07:00:28 +0100 |
---|---|---|
committer | V3n3RiX <venerix@redcorelinux.org> | 2018-06-23 07:00:28 +0100 |
commit | e23cdda4dbb0c83b9e682ab5e916085a35203da5 (patch) | |
tree | 5a4ac448a3b288b731c24d947e0ce52df3cab07b /kde-apps/kio-extras/files | |
parent | 8187a741807f3e9a9e26304973cf18087dcf2560 (diff) |
gentoo resync : 23.06.2018
Diffstat (limited to 'kde-apps/kio-extras/files')
-rw-r--r-- | kde-apps/kio-extras/files/kio-extras-18.04.2-fix-sftp-links.patch | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/kde-apps/kio-extras/files/kio-extras-18.04.2-fix-sftp-links.patch b/kde-apps/kio-extras/files/kio-extras-18.04.2-fix-sftp-links.patch new file mode 100644 index 000000000000..8f7c02338794 --- /dev/null +++ b/kde-apps/kio-extras/files/kio-extras-18.04.2-fix-sftp-links.patch @@ -0,0 +1,227 @@ +From bca40518682a038aa08823fbbfb2cc4b9ef63802 Mon Sep 17 00:00:00 2001 +From: Jaime Torres <jtamate@gmail.com> +Date: Wed, 13 Jun 2018 19:21:34 +0200 +Subject: fix sftp links with new uds implementation + +Summary: +When listening a directory with links in sftp, the type of the entry of a symlink was inserted twice. +Now the entry data is inserted only once. +Get rid of the goto statement using local variables. + +Test Plan: Tested in sftp://127.0.0.1 with broken symbolic links and sftp://127.0.0.1/usr/lib64 with a lot of symbolic links. + +Reviewers: dfaure, martinkostolny, asturmlechner, lbeltrame, bruns + +Reviewed By: dfaure, martinkostolny + +Differential Revision: https://phabricator.kde.org/D13475 +--- + sftp/kio_sftp.cpp | 129 ++++++++++++++++++++++++++++-------------------------- + 1 file changed, 67 insertions(+), 62 deletions(-) + +diff --git a/sftp/kio_sftp.cpp b/sftp/kio_sftp.cpp +index 0a82365..f515458 100644 +--- a/sftp/kio_sftp.cpp ++++ b/sftp/kio_sftp.cpp +@@ -342,6 +342,9 @@ bool sftpProtocol::createUDSEntry(const QString &filename, const QByteArray &pat + mode_t type; + mode_t access; + char *link; ++ bool isBrokenLink = false; ++ long long fileType = S_IFREG; ++ long long size = 0LL; + + Q_ASSERT(entry.count() == 0); + +@@ -353,54 +356,53 @@ bool sftpProtocol::createUDSEntry(const QString &filename, const QByteArray &pat + entry.insert(KIO::UDSEntry::UDS_NAME, filename); + + if (sb->type == SSH_FILEXFER_TYPE_SYMLINK) { +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); + link = sftp_readlink(mSftp, path.constData()); + if (link == nullptr) { + sftp_attributes_free(sb); + return false; + } + entry.insert(KIO::UDSEntry::UDS_LINK_DEST, QFile::decodeName(link)); +- delete link; ++ free(link); + // A symlink -> follow it only if details > 1 + if (details > 1) { + sftp_attributes sb2 = sftp_stat(mSftp, path.constData()); + if (sb2 == nullptr) { +- // It is a link pointing to nowhere +- type = S_IFMT - 1; +- access = S_IRWXU | S_IRWXG | S_IRWXO; +- entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, type); +- entry.insert( KIO::UDSEntry::UDS_ACCESS, access); +- entry.insert( KIO::UDSEntry::UDS_SIZE, 0LL ); +- +- goto notype; ++ isBrokenLink = true; ++ } else { ++ sftp_attributes_free(sb); ++ sb = sb2; + } +- sftp_attributes_free(sb); +- sb = sb2; + } + } + +- switch (sb->type) { +- case SSH_FILEXFER_TYPE_REGULAR: +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); +- break; +- case SSH_FILEXFER_TYPE_DIRECTORY: +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); +- break; +- case SSH_FILEXFER_TYPE_SYMLINK: +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFLNK); +- break; +- case SSH_FILEXFER_TYPE_SPECIAL: +- case SSH_FILEXFER_TYPE_UNKNOWN: +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFMT - 1); +- break; ++ if (isBrokenLink) { ++ // It is a link pointing to nowhere ++ fileType = S_IFMT - 1; ++ access = S_IRWXU | S_IRWXG | S_IRWXO; ++ size = 0LL; ++ } else { ++ switch (sb->type) { ++ case SSH_FILEXFER_TYPE_REGULAR: ++ fileType = S_IFREG; ++ break; ++ case SSH_FILEXFER_TYPE_DIRECTORY: ++ fileType = S_IFDIR; ++ break; ++ case SSH_FILEXFER_TYPE_SYMLINK: ++ fileType = S_IFLNK; ++ break; ++ case SSH_FILEXFER_TYPE_SPECIAL: ++ case SSH_FILEXFER_TYPE_UNKNOWN: ++ fileType = S_IFMT - 1; ++ break; ++ } ++ access = sb->permissions & 07777; ++ size = sb->size; + } +- +- access = sb->permissions & 07777; ++ entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, fileType); + entry.insert(KIO::UDSEntry::UDS_ACCESS, access); ++ entry.insert( KIO::UDSEntry::UDS_SIZE, size); + +- entry.insert(KIO::UDSEntry::UDS_SIZE, sb->size); +- +-notype: + if (details > 0) { + if (sb->owner) { + entry.insert(KIO::UDSEntry::UDS_USER, QString::fromUtf8(sb->owner)); +@@ -419,6 +421,7 @@ notype: + entry.insert(KIO::UDSEntry::UDS_CREATION_TIME, sb->createtime); + } + ++ + sftp_attributes_free(sb); + + return true; +@@ -1830,6 +1833,9 @@ void sftpProtocol::listDir(const QUrl& url) { + mode_t access; + mode_t type; + char *link; ++ bool isBrokenLink = false; ++ long long fileType = S_IFREG; ++ long long size = 0LL; + + dirent = sftp_readdir(mSftp, dp); + if (dirent == nullptr) { +@@ -1842,8 +1848,6 @@ void sftpProtocol::listDir(const QUrl& url) { + if (dirent->type == SSH_FILEXFER_TYPE_SYMLINK) { + QByteArray file = path + '/' + QFile::decodeName(dirent->name).toUtf8(); + +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); +- + link = sftp_readlink(mSftp, file.constData()); + if (link == nullptr) { + sftp_attributes_free(dirent); +@@ -1851,46 +1855,47 @@ void sftpProtocol::listDir(const QUrl& url) { + return; + } + entry.insert(KIO::UDSEntry::UDS_LINK_DEST, QFile::decodeName(link)); +- delete link; ++ free(link); + // A symlink -> follow it only if details > 1 + if (details > 1) { + sftp_attributes sb = sftp_stat(mSftp, file.constData()); + if (sb == nullptr) { +- // It is a link pointing to nowhere +- type = S_IFMT - 1; +- access = S_IRWXU | S_IRWXG | S_IRWXO; +- entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, type); +- entry.insert( KIO::UDSEntry::UDS_ACCESS, access); +- entry.insert( KIO::UDSEntry::UDS_SIZE, 0LL ); +- +- goto notype; ++ isBrokenLink = true; ++ } else { ++ sftp_attributes_free(dirent); ++ dirent = sb; + } +- sftp_attributes_free(dirent); +- dirent = sb; + } + } + +- switch (dirent->type) { +- case SSH_FILEXFER_TYPE_REGULAR: +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); +- break; +- case SSH_FILEXFER_TYPE_DIRECTORY: +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); +- break; +- case SSH_FILEXFER_TYPE_SYMLINK: +- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFLNK); +- break; +- case SSH_FILEXFER_TYPE_SPECIAL: +- case SSH_FILEXFER_TYPE_UNKNOWN: +- break; +- } ++ if (isBrokenLink) { ++ // It is a link pointing to nowhere ++ fileType = S_IFMT - 1; ++ access = S_IRWXU | S_IRWXG | S_IRWXO; ++ size = 0LL; ++ } else { ++ switch (dirent->type) { ++ case SSH_FILEXFER_TYPE_REGULAR: ++ fileType = S_IFREG; ++ break; ++ case SSH_FILEXFER_TYPE_DIRECTORY: ++ fileType = S_IFDIR; ++ break; ++ case SSH_FILEXFER_TYPE_SYMLINK: ++ fileType = S_IFLNK; ++ break; ++ case SSH_FILEXFER_TYPE_SPECIAL: ++ case SSH_FILEXFER_TYPE_UNKNOWN: ++ break; ++ } + +- access = dirent->permissions & 07777; ++ access = dirent->permissions & 07777; ++ size = dirent->size; ++ } ++ entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, fileType); + entry.insert(KIO::UDSEntry::UDS_ACCESS, access); ++ entry.insert(KIO::UDSEntry::UDS_SIZE, size); + +- entry.insert(KIO::UDSEntry::UDS_SIZE, dirent->size); +- +-notype: + if (details > 0) { + if (dirent->owner) { + entry.insert(KIO::UDSEntry::UDS_USER, QString::fromUtf8(dirent->owner)); +-- +cgit v0.11.2 + |