diff --git a/sftp/kio_sftp.cpp b/sftp/kio_sftp.cpp --- a/sftp/kio_sftp.cpp +++ b/sftp/kio_sftp.cpp @@ -1839,36 +1839,9 @@ entry.clear(); entry.insert(KIO::UDSEntry::UDS_NAME, QFile::decodeName(dirent->name)); - 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); - error(KIO::ERR_INTERNAL, i18n("Could not read link: %1", QString::fromUtf8(file))); - return; - } - entry.insert(KIO::UDSEntry::UDS_LINK_DEST, QFile::decodeName(link)); - delete 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; - } - sftp_attributes_free(dirent); - dirent = sb; - } - } + access = dirent->permissions & 07777; + entry.insert(KIO::UDSEntry::UDS_ACCESS, access); + entry.insert(KIO::UDSEntry::UDS_SIZE, dirent->size); switch (dirent->type) { case SSH_FILEXFER_TYPE_REGULAR: @@ -1878,19 +1851,41 @@ entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); break; case SSH_FILEXFER_TYPE_SYMLINK: - entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFLNK); + { + entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFLNK); + + QByteArray file = path + '/' + QFile::decodeName(dirent->name).toUtf8(); + link = sftp_readlink(mSftp, file.constData()); + if (link == nullptr) { + sftp_attributes_free(dirent); + error(KIO::ERR_INTERNAL, i18n("Could not read link: %1", QString::fromUtf8(file))); + return; + } + entry.insert(KIO::UDSEntry::UDS_LINK_DEST, QFile::decodeName(link)); + delete 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.replace( KIO::UDSEntry::UDS_FILE_TYPE, type); + entry.replace( KIO::UDSEntry::UDS_ACCESS, access); + entry.replace( KIO::UDSEntry::UDS_SIZE, 0LL ); + } else { + sftp_attributes_free(dirent); + dirent = sb; + } + } + } break; case SSH_FILEXFER_TYPE_SPECIAL: + break; case SSH_FILEXFER_TYPE_UNKNOWN: break; } - access = dirent->permissions & 07777; - entry.insert(KIO::UDSEntry::UDS_ACCESS, access); - - 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));