diff --git a/autotests/usermetadatawritertest.h b/autotests/usermetadatawritertest.h --- a/autotests/usermetadatawritertest.h +++ b/autotests/usermetadatawritertest.h @@ -31,6 +31,7 @@ private Q_SLOTS: void initTestCase(); void test(); + void testDanglingSymlink(); void cleanupTestCase(); }; diff --git a/autotests/usermetadatawritertest.cpp b/autotests/usermetadatawritertest.cpp --- a/autotests/usermetadatawritertest.cpp +++ b/autotests/usermetadatawritertest.cpp @@ -25,6 +25,7 @@ #include #define TEST_FILENAME "writertest.txt" +#define TEST_SYMLINK "dangling_symlink" using namespace KFileMetaData; @@ -38,6 +39,8 @@ QFile testFile(testFilePath("plain_text_file.txt")); QFile writerTestFile(testFilePath(TEST_FILENAME)); QFile::copy(testFilePath("plain_text_file.txt"), testFilePath(TEST_FILENAME)); + + QFile::link(testFilePath("invalid_target"), testFilePath(TEST_SYMLINK)); } void UserMetaDataWriterTest::test() @@ -119,9 +122,17 @@ QVERIFY(!md.hasAttribute(QStringLiteral("test.check_contains"))); } + +void UserMetaDataWriterTest::testDanglingSymlink() +{ + KFileMetaData::UserMetaData md(testFilePath(TEST_SYMLINK)); + QVERIFY(md.queryAttributes(UserMetaData::Attribute::All) == UserMetaData::Attribute::None); +} + void UserMetaDataWriterTest::cleanupTestCase() { QFile::remove(testFilePath(TEST_FILENAME)); + QFile::remove(testFilePath(TEST_SYMLINK)); } QTEST_GUILESS_MAIN(UserMetaDataWriterTest) diff --git a/src/xattr_p.h b/src/xattr_p.h --- a/src/xattr_p.h +++ b/src/xattr_p.h @@ -225,15 +225,15 @@ return UserMetaData::Attribute::None; } - if (size == -1 && errno == ENOTSUP) { - return UserMetaData::Attribute::None; - } + if (size < 0) { + if (errno == E2BIG) { + return UserMetaData::Attribute::All; + } - if (size == -1 && errno == E2BIG) { - return UserMetaData::Attribute::All; + return UserMetaData::Attribute::None; } - if (size > 0 && attributes == UserMetaData::Attribute::Any) { + if (attributes == UserMetaData::Attribute::Any) { return UserMetaData::Attribute::All; }