NSS_STATUS LsaNssSolarisGroupGetgroupsbymember( nss_backend_t* pBackend, void* pArgs ) { struct nss_groupsbymem* pGroupsByMem = (struct nss_groupsbymem*) pArgs; PCSTR pszUserName = pGroupsByMem->username; int* pResultsSize = &pGroupsByMem->numgids; int* pResultsCapacity = &pGroupsByMem->maxgids; gid_t* pGidResults = pGroupsByMem->gid_array; int err = 0; int* pErrorNumber = &err; int ret = NSS_STATUS_SUCCESS; PLSA_NSS_GROUP_BACKEND pLsaBackend = (PLSA_NSS_GROUP_BACKEND) pBackend; size_t myResultsSize = *pResultsSize; size_t myResultsCapacity = *pResultsCapacity; NSS_LOCK(); ret = LsaNssCommonGroupGetGroupsByUserName( &pLsaBackend->lsaConnection, pszUserName, myResultsSize, myResultsCapacity, &myResultsSize, pGidResults, pErrorNumber); NSS_UNLOCK(); if (ret == NSS_STATUS_SUCCESS) { if (myResultsSize > myResultsCapacity) myResultsSize = myResultsCapacity; *pResultsSize = (int) myResultsSize; } return ret; }
NSS_STATUS _nss_lsass_initgroups_dyn( PCSTR pszUserName, gid_t groupGid, long int* pResultsSize, long int* pResultsCapacity, gid_t** ppGidResults, long int maxGroups, int* pErrorNumber ) { int ret = NSS_STATUS_SUCCESS; size_t resultsCapacity = (size_t) *pResultsCapacity; size_t resultsExistingSize = (size_t) *pResultsSize; size_t resultsSize = 0; gid_t* pGidResults = *ppGidResults; gid_t* pGidResultsNew = NULL; NSS_LOCK(); ret = LsaNssCommonGroupGetGroupsByUserName( &lsaConnection, pszUserName, resultsExistingSize, resultsCapacity, &resultsSize, pGidResults, pErrorNumber); if (ret != NSS_STATUS_SUCCESS) goto error; if (resultsSize > resultsCapacity) { /* More results were found than were stored, so reallocate array and try again. */ pGidResultsNew = realloc(pGidResults, sizeof(*pGidResults) * resultsSize); if (!pGidResultsNew) { *pErrorNumber = ENOMEM; ret = NSS_STATUS_UNAVAIL; goto error; } else { pGidResults = pGidResultsNew; *ppGidResults = pGidResults; } /* The number of filled elements is whatever our old capacity was */ resultsExistingSize = resultsCapacity; /* The new capacity is the number of available results */ resultsCapacity = resultsSize; /* Try again */ ret = LsaNssCommonGroupGetGroupsByUserName( &lsaConnection, pszUserName, resultsExistingSize, resultsCapacity, &resultsSize, pGidResults, pErrorNumber); } if (ret == NSS_STATUS_SUCCESS) { *pResultsSize = (long int) resultsSize; *pResultsCapacity = (long int) resultsCapacity; } error: NSS_UNLOCK(); return ret; }