| 4058 | } |
| 4059 | |
| 4060 | static bool win_file_owner_secure(win_security_t *security, HANDLE file, |
| 4061 | bool require_current_user) { |
| 4062 | PSID owner = NULL; |
| 4063 | PSECURITY_DESCRIPTOR descriptor = NULL; |
| 4064 | DWORD status = security->get_security_info(file, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, |
| 4065 | &owner, NULL, NULL, NULL, &descriptor); |
| 4066 | bool queried = status == ERROR_SUCCESS && owner && security->is_valid_sid(owner); |
| 4067 | bool secure = |
| 4068 | queried && (require_current_user ? security->equal_sid(owner, security->user_sid) != 0 |
| 4069 | : win_sid_trusted(security, owner)); |
| 4070 | if (!queried) { |
| 4071 | ipc_validation_detail_set("owner query failed (status %lu)", (unsigned long)status); |
| 4072 | } else if (!secure) { |
| 4073 | const char *owner_class = security->is_well_known_sid(owner, WinLocalSystemSid) ? "SYSTEM" |
| 4074 | : security->is_well_known_sid(owner, WinBuiltinAdministratorsSid) |
| 4075 | ? "Administrators" |
| 4076 | : "another account"; |
| 4077 | ipc_validation_detail_set("owner is %s, %s required", owner_class, |
| 4078 | require_current_user ? "the exact user" : "a trusted identity"); |
| 4079 | } |
| 4080 | if (descriptor) { |
| 4081 | (void)LocalFree(descriptor); |
| 4082 | } |
| 4083 | return secure; |
| 4084 | } |
| 4085 | |
| 4086 | static DWORD win_private_mutation_rights(void) { |
| 4087 | return GENERIC_ALL | GENERIC_WRITE | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_ADD_FILE | |
no test coverage detected