Accepting request 538078 from home:wolfi323:branches:KDE:Applications

- Add workaround-bug-in-libsmbclient-4.7.patch to make browsing
  samba shares work with libsmbclient 4.7 (boo#1065868, kde#385708)

OBS-URL: https://build.opensuse.org/request/show/538078
OBS-URL: https://build.opensuse.org/package/show/KDE:Applications/kio-extras5?expand=0&rev=63
This commit is contained in:
Luca Beltrame 2017-11-01 14:16:40 +00:00 committed by Git OBS Bridge
parent 1e1edf9da1
commit da048b10fa
3 changed files with 127 additions and 0 deletions

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Wed Nov 1 12:36:03 UTC 2017 - wbauer@tmo.at
- Add workaround-bug-in-libsmbclient-4.7.patch to make browsing
samba shares work with libsmbclient 4.7 (boo#1065868, kde#385708)
-------------------------------------------------------------------
Tue Oct 17 00:32:11 CEST 2017 - lbeltrame@kde.org

View File

@ -31,6 +31,8 @@ Url: http://www.kde.org
Source: kio-extras-%{version}.tar.xz
Source99: %{name}-rpmlintrc
Patch0: fix-mtp-paste-with-KF5-5.25.diff
# PATCH-FIX-UPSTREAM
Patch1: workaround-bug-in-libsmbclient-4.7.patch
BuildRequires: OpenEXR-devel
BuildRequires: flac-devel
BuildRequires: gperf
@ -108,6 +110,7 @@ This is the development package for libkioarchive
%prep
%setup -q -n kio-extras-%{version}
%patch0 -p1
%patch1 -p1
sed -i '/^add_subdirectory( doc )/d' CMakeLists.txt
%build

View File

@ -0,0 +1,118 @@
From a36b797913a844dbb26d5dc1542b3ce304f5f445 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michal=20Mal=C3=BD?= <malymi@natur.cuni.cz>
Date: Tue, 31 Oct 2017 18:19:21 -0600
Subject: Workaround incorrectly returned EEXIST instead of EPERM regression
introduced by libsmbclient 4.7
Summary:
There appears to be an issue with libsmbclient 4.7 that returns nonsensical EEXIST error code when a user has not authenticated themselves to access password-protected shares. This patch attempts to work around the issue by treating EEXIST as another case of "invalid login credentials". The workaround tries to detect broken versions of libsmbclient and enables itself only when such a version is found.
See https://bugzilla.samba.org/show_bug.cgi?id=13050 for upstream bug report.
BUG: 385708
Reviewers: ngraham, davidedmundson, elvisangelaccio, #frameworks
Reviewed By: ngraham, davidedmundson
Subscribers: cfeck, rdieter, graesslin, z3ntu
Differential Revision: https://phabricator.kde.org/D8387
---
smb/kio_smb.cpp | 30 +++++++++++++++++++++++++++++-
smb/kio_smb.h | 3 +++
smb/kio_smb_browse.cpp | 7 ++++++-
3 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/smb/kio_smb.cpp b/smb/kio_smb.cpp
index 2a2e424..1ea3f99 100644
--- a/smb/kio_smb.cpp
+++ b/smb/kio_smb.cpp
@@ -31,12 +31,40 @@
#include "kio_smb.h"
#include "kio_smb_internal.h"
#include <QCoreApplication>
+#include <QVersionNumber>
Q_LOGGING_CATEGORY(KIO_SMB, "kio_smb")
+bool needsEEXISTWorkaround()
+{
+ /* There is an issue with some libsmbclient versions that return EEXIST
+ * return code from smbc_opendir() instead of EPERM when the user
+ * tries to access a resource that requires login authetification.
+ * We are working around the issue by treating EEXIST as a special case
+ * of "invalid/unavailable credentials" if we detect that we are using
+ * the affected versions of libsmbclient
+ *
+ * Upstream bug report: https://bugzilla.samba.org/show_bug.cgi?id=13050
+ */
+ static const QVersionNumber firstBrokenVer{4, 7, 0};
+ static const QVersionNumber lastBrokenVer{9, 9, 9}; /* Adjust accordingly when this gets fixed upstream */
+
+ const QVersionNumber currentVer = QVersionNumber::fromString(smbc_version());
+ qCDebug(KIO_SMB) << "Using libsmbclient library version" << currentVer;
+
+ if (currentVer >= firstBrokenVer && currentVer <= lastBrokenVer) {
+ qCDebug(KIO_SMB) << "Detected broken libsmbclient version" << currentVer;
+ return true;
+ }
+
+ return false;
+}
+
//===========================================================================
SMBSlave::SMBSlave(const QByteArray& pool, const QByteArray& app)
- : SlaveBase( "smb", pool, app ), m_openFd(-1)
+ : SlaveBase( "smb", pool, app ),
+ m_openFd(-1),
+ m_enableEEXISTWorkaround(needsEEXISTWorkaround())
{
m_initialized_smbc = false;
diff --git a/smb/kio_smb.h b/smb/kio_smb.h
index 77866b1..22fa036 100644
--- a/smb/kio_smb.h
+++ b/smb/kio_smb.h
@@ -278,6 +278,7 @@ private:
void smbCopy(const QUrl& src, const QUrl &dest, int permissions, KIO::JobFlags flags);
void smbCopyGet(const QUrl& src, const QUrl& dest, int permissions, KIO::JobFlags flags);
void smbCopyPut(const QUrl& src, const QUrl& dest, int permissions, KIO::JobFlags flags);
+ bool workaroundEEXIST(const int errNum) const;
void fileSystemFreeSpace(const QUrl &url);
@@ -288,6 +289,8 @@ private:
*/
int m_openFd;
SMBUrl m_openUrl;
+
+ const bool m_enableEEXISTWorkaround; /* Enables a workaround for some broken libsmbclient versions */
};
//==========================================================================
diff --git a/smb/kio_smb_browse.cpp b/smb/kio_smb_browse.cpp
index 5995eec..47b2b32 100644
--- a/smb/kio_smb_browse.cpp
+++ b/smb/kio_smb_browse.cpp
@@ -473,7 +473,7 @@ void SMBSlave::listDir( const QUrl& kurl )
}
else
{
- if (errNum == EPERM || errNum == EACCES) {
+ if (errNum == EPERM || errNum == EACCES || workaroundEEXIST(errNum)) {
if (checkPassword(m_current_url)) {
redirection( m_current_url );
finished();
@@ -522,3 +522,8 @@ void SMBSlave::fileSystemFreeSpace(const QUrl& url)
finished();
}
+bool SMBSlave::workaroundEEXIST(const int errNum) const
+{
+ return (errNum == EEXIST) && m_enableEEXISTWorkaround;
+}
+
--
cgit v0.11.2