struct netr_SamInfo3 *copy_netr_SamInfo3(TALLOC_CTX *mem_ctx, struct netr_SamInfo3 *orig) { struct netr_SamInfo3 *info3; unsigned int i; NTSTATUS status; info3 = talloc_zero(mem_ctx, struct netr_SamInfo3); if (!info3) return NULL; status = copy_netr_SamBaseInfo(info3, &orig->base, &info3->base); if (!NT_STATUS_IS_OK(status)) { TALLOC_FREE(info3); return NULL; } if (orig->sidcount) { info3->sidcount = orig->sidcount; info3->sids = talloc_array(info3, struct netr_SidAttr, orig->sidcount); RET_NOMEM(info3->sids); for (i = 0; i < orig->sidcount; i++) { info3->sids[i].sid = dom_sid_dup(info3->sids, orig->sids[i].sid); RET_NOMEM(info3->sids[i].sid); info3->sids[i].attributes = orig->sids[i].attributes; } }
static NTSTATUS map_validation_to_info3(TALLOC_CTX *mem_ctx, uint16_t validation_level, union netr_Validation *validation, struct netr_SamInfo3 **info3_p) { struct netr_SamInfo3 *info3; NTSTATUS status; if (validation == NULL) { return NT_STATUS_INVALID_PARAMETER; } switch (validation_level) { case 3: if (validation->sam3 == NULL) { return NT_STATUS_INVALID_PARAMETER; } info3 = talloc_move(mem_ctx, &validation->sam3); break; case 6: if (validation->sam6 == NULL) { return NT_STATUS_INVALID_PARAMETER; } info3 = talloc_zero(mem_ctx, struct netr_SamInfo3); if (info3 == NULL) { return NT_STATUS_NO_MEMORY; } status = copy_netr_SamBaseInfo(info3, &validation->sam6->base, &info3->base); if (!NT_STATUS_IS_OK(status)) { TALLOC_FREE(info3); return status; } info3->sidcount = validation->sam6->sidcount; info3->sids = talloc_move(info3, &validation->sam6->sids); break; default: return NT_STATUS_BAD_VALIDATION_CLASS; } *info3_p = info3; return NT_STATUS_OK; }