diff --git a/src/dll/posix.c b/src/dll/posix.c index 7210af90..b7e39b45 100644 --- a/src/dll/posix.c +++ b/src/dll/posix.c @@ -742,8 +742,10 @@ FSP_API NTSTATUS FspPosixMapSecurityDescriptorToPermissions( (FspPosixMapAccessMaskToPermission(GroupAllow) << 3) | (FspPosixMapAccessMaskToPermission(WorldAllow)); if (0 != (OwnerAllow & FILE_DELETE_CHILD) && - 0 == (GroupAllow & FILE_DELETE_CHILD) && - 0 == (WorldAllow & FILE_DELETE_CHILD)) + ( + (0 == (GroupAllow & FILE_DELETE_CHILD) && 0 != (Mode & 0000020)) || + (0 == (WorldAllow & FILE_DELETE_CHILD) && 0 != (Mode & 0000002)) + )) Mode |= 0001000; /* sticky bit */ } else diff --git a/tst/winfsp-tests/posix-test.c b/tst/winfsp-tests/posix-test.c index e1cc4905..566d4d8a 100644 --- a/tst/winfsp-tests/posix-test.c +++ b/tst/winfsp-tests/posix-test.c @@ -171,6 +171,13 @@ void posix_map_sd_test(void) { L"O:SYG:BAD:P(A;;0x1f01b9;;;SY)(D;;DCLC;;;SY)(A;;0x1201af;;;BA)(A;;0x1200a9;;;WD)", 18, 544, 00575 }, { L"O:SYG:BAD:P(A;;0x1f01bf;;;SY)(A;;0x1200a9;;;BA)(D;;DCLCCR;;;BA)(A;;0x1201af;;;WD)", 18, 544, 00757 }, + + { L"O:SYG:BAD:P(A;;0x1f01bf;;;SY)(A;;0x1200a9;;;BA)(A;;0x1200a9;;;WD)", 18, 544, 00755 }, + { L"O:SYG:BAD:P(A;;FA;;;SY)(A;;0x1200a9;;;BA)(A;;0x1200a9;;;WD)", 18, 544, 0040755 }, + + { L"O:SYG:BAD:P(A;;0x1f01bf;;;SY)(A;;0x1201af;;;BA)(A;;0x1201af;;;WD)", 18, 544, 00777 }, + { L"O:SYG:BAD:P(A;;FA;;;SY)(A;;0x1201ef;;;BA)(A;;0x1201ef;;;WD)", 18, 544, 0040777 }, + { L"O:SYG:BAD:P(A;;FA;;;SY)(A;;0x1201af;;;BA)(A;;0x1201af;;;WD)", 18, 544, 0041777 }, }; NTSTATUS Result; BOOL Success;