diff --git a/autotests/usermetadatawritertest.cpp b/autotests/usermetadatawritertest.cpp --- a/autotests/usermetadatawritertest.cpp +++ b/autotests/usermetadatawritertest.cpp @@ -95,6 +95,13 @@ QCOMPARE(md.attribute(QStringLiteral("test.attribute")), QStringLiteral("attribute")); md.setAttribute(QStringLiteral("test.attribute"), QString()); QVERIFY(!md.hasAttribute(QStringLiteral("test.attribute"))); + + // Check for side effects of calling sequence + QVERIFY(!md.hasAttribute(QStringLiteral("test.check_contains"))); + md.setAttribute(QStringLiteral("test.check_contains"), QStringLiteral("dummy")); + QVERIFY(md.hasAttribute(QStringLiteral("test.check_contains"))); + md.setAttribute(QStringLiteral("test.check_contains"), QString()); + QVERIFY(!md.hasAttribute(QStringLiteral("test.check_contains"))); } void UserMetaDataWriterTest::cleanupTestCase() diff --git a/src/xattr_p.h b/src/xattr_p.h --- a/src/xattr_p.h +++ b/src/xattr_p.h @@ -82,10 +82,12 @@ const ssize_t size = 0; #endif + if (!value) { + return size; + } + if (size <= 0) { - if (value) { - value->clear(); - } + value->clear(); return size; } @@ -106,7 +108,7 @@ const ssize_t r = 0; #endif - if(value) *value = QString::fromUtf8(data); + *value = QString::fromUtf8(data); return r; } @@ -218,17 +220,16 @@ CloseHandle(hFile); return false; #else - k_getxattr(path, name, nullptr); - return (errno != ENOATTR); + auto ret = k_getxattr(path, name, nullptr); + return (ret >= 0); #endif } inline bool k_isSupported(const QString& path) { - QString value; #if defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) - k_getxattr(path, QStringLiteral("user.test"), &value); - return (errno != ENOTSUP); + auto ret = k_getxattr(path, QStringLiteral("user.test"), nullptr); + return (ret >= 0) || (errno != ENOTSUP); #elif defined(Q_OS_WIN) QFileInfo f(path); const QString drive = QString(f.absolutePath().left(2)) + QStringLiteral("\\");