static int group_vector_to_array(const std::vector<gid_t> &vgroups, gid_t **groups, size_t *groups_count)
{
+ if (vgroups.empty()) {
+ *groups_count = 0;
+ *groups = NULL;
+ return SECURITY_MANAGER_SUCCESS;
+ }
+
size_t size = vgroups.size() * sizeof(gid_t);
*groups = static_cast<gid_t*>(malloc(size));
if (*groups == nullptr)
return NSS_STATUS_NOTFOUND;
}
- gid_t *groups;
+ gid_t *groups = NULL;
size_t groupsCount;
ret = security_manager_groups_get_for_user(pwnam->pw_uid, &groups, &groupsCount);
// If user is not managed by Security Manager, we want to apply all the groups
ret = security_manager_groups_get(&groups, &groupsCount);
}
- auto groupsGuard = SecurityManager::makeUnique(groups, free);
if (ret == SECURITY_MANAGER_ERROR_MEMORY) {
*errnop = ENOMEM;
return NSS_STATUS_UNAVAIL;
}
+ auto groupsGuard = SecurityManager::makeUnique(groups, free);
+
if (((*size) - (*start)) < static_cast<long int>(groupsCount)) {
long int required = (*start) + groupsCount;
// value bigger is the lowest power of 2 that is bigger than required value