[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kio-extras] smb: Workaround incorrectly returned EEXIST instead of EPERM regression introduced by l
From:       Nathaniel Graham <null () kde ! org>
Date:       2017-11-01 0:21:58
Message-ID: E1e9gn8-00008u-H4 () code ! kde ! org
[Download RAW message or body]

Git commit a36b797913a844dbb26d5dc1542b3ce304f5f445 by Nathaniel Graham, on behalf of \
Michal MalĂ˝. Committed on 01/11/2017 at 00:21.
Pushed by ngraham into branch 'master'.

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

M  +29   -1    smb/kio_smb.cpp
M  +3    -0    smb/kio_smb.h
M  +6    -1    smb/kio_smb_browse.cpp

https://commits.kde.org/kio-extras/a36b797913a844dbb26d5dc1542b3ce304f5f445

diff --git a/smb/kio_smb.cpp b/smb/kio_smb.cpp
index 2a2e424b..1ea3f99c 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 77866b10..22fa036c 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 5995eec6..47b2b328 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;
+}
+


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic