SVN commit 498977 by tilladam: Don't re-calculate the maximum possible mask based on named groups and users when there is already a specific one set. Add test case for adding a mask to an ACL which previously didn't have one. Thanks for the nice test case, Tim. BUG: 119366 M +14 -5 kio/kacl.cpp M +14 -0 tests/kacltest.cpp M +1 -0 tests/kacltest.h --- branches/KDE/3.5/kdelibs/kio/kio/kacl.cpp #498976:498977 @@ -289,7 +289,12 @@ #ifdef USE_POSIX_ACL bool KACL::KACLPrivate::setMaskPermissions( unsigned short v ) { - permissionsToEntry( entryForTag( m_acl, ACL_MASK ), v ); + acl_entry_t entry = entryForTag( m_acl, ACL_MASK ); + if ( entry == 0 ) { + acl_create_entry( &m_acl, &entry ); + acl_set_tag_type( entry, ACL_MASK ); + } + permissionsToEntry( entry, v ); return true; } #endif @@ -372,8 +377,10 @@ if ( allIsWell && createdNewEntry ) { // 23.1.1 of 1003.1e states that as soon as there is a named user or // named group entry, there needs to be a mask entry as well, so add - // one. - setMaskPermissions( acl_calc_mask( &newACL ) ); + // one, if the user hasn't explicitely set one. + if ( entryForTag( newACL, ACL_MASK ) == 0 ) { + acl_calc_mask( &newACL ); + } } if ( !allIsWell || acl_valid( newACL ) != 0 ) { @@ -469,8 +476,10 @@ if ( allIsWell && atLeastOneUserOrGroup ) { // 23.1.1 of 1003.1e states that as soon as there is a named user or // named group entry, there needs to be a mask entry as well, so add - // one. - setMaskPermissions( acl_calc_mask( &newACL ) ); + // one, if the user hasn't explicitely set one. + if ( entryForTag( newACL, ACL_MASK ) == 0 ) { + acl_calc_mask( &newACL ); + } } if ( allIsWell && ( acl_valid( newACL ) == 0 ) ) { acl_free( m_acl ); --- branches/KDE/3.5/kdelibs/kio/tests/kacltest.cpp #498976:498977 @@ -126,6 +126,8 @@ testSettingBasic(); testSettingExtended(); testSettingErrorHandling(); + + testNewMask(); } void KACLTest::cleanup() @@ -293,3 +295,15 @@ v = foo.setNamedUserPermissions( "jongel", 7 ); // non-existing user check( "Non-existing user: ", v, false ); } + +void KACLTest::testNewMask() +{ + KACL CharlesII( "user::rw-\ngroup::rw-\nother::rw\n" ); + bool dummy = false; + CharlesII.maskPermissions( dummy ); + check( "mask exists: ", dummy, false ); + + CharlesII.setMaskPermissions( 6 ); + check( "new mask set: ", QString::number( CharlesII.maskPermissions( dummy ) ), "6" ); + check( "mask exists now: ", dummy, true ); +} --- branches/KDE/3.5/kdelibs/kio/tests/kacltest.h #498976:498977 @@ -44,6 +44,7 @@ void testSettingBasic(); void testSettingExtended(); void testSettingErrorHandling(); + void testNewMask(); private: KACL m_acl;