1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

r3907: * Rename lsa_Name to lsa_String

* Add new IDL to LSA, to query information about trusted domains (for
  cross-check with SamSync).

Andrew Bartlett
This commit is contained in:
Andrew Bartlett 2004-11-22 11:59:59 +00:00 committed by Gerald (Jerry) Carter
parent df924e1822
commit 174c077842
4 changed files with 125 additions and 63 deletions

View File

@ -30,13 +30,13 @@
/* Function: 0x02 */ /* Function: 0x02 */
typedef struct { typedef struct {
[value(2*strlen_m(r->name))] uint16 name_len; [value(2*strlen_m(r->string))] uint16 length;
[value(r->name_len)] uint16 name_size; [value(r->length)] uint16 size;
unistr_noterm *name; unistr_noterm *string;
} lsa_Name; } lsa_String;
typedef struct { typedef struct {
lsa_Name name; lsa_String name;
uint32 luid_low; uint32 luid_low;
uint32 luid_high; uint32 luid_high;
} lsa_PrivEntry; } lsa_PrivEntry;
@ -122,12 +122,12 @@
} lsa_AuditEventsInfo; } lsa_AuditEventsInfo;
typedef struct { typedef struct {
lsa_Name name; lsa_String name;
dom_sid2 *sid; dom_sid2 *sid;
} lsa_DomainInfo; } lsa_DomainInfo;
typedef struct { typedef struct {
lsa_Name name; lsa_String name;
} lsa_PDAccountInfo; } lsa_PDAccountInfo;
typedef struct { typedef struct {
@ -136,8 +136,8 @@
} lsa_ServerRole; } lsa_ServerRole;
typedef struct { typedef struct {
lsa_Name source; lsa_String source;
lsa_Name account; lsa_String account;
} lsa_ReplicaSourceInfo; } lsa_ReplicaSourceInfo;
typedef struct { typedef struct {
@ -165,9 +165,9 @@
} lsa_AuditFullQueryInfo; } lsa_AuditFullQueryInfo;
typedef struct { typedef struct {
lsa_Name name; lsa_String name;
lsa_Name dns_domain; lsa_String dns_domain;
lsa_Name dns_forest; lsa_String dns_forest;
GUID domain_guid; GUID domain_guid;
dom_sid2 *sid; dom_sid2 *sid;
} lsa_DnsDomainInfo; } lsa_DnsDomainInfo;
@ -248,8 +248,8 @@
/* Function: 0x0c */ /* Function: 0x0c */
typedef struct { typedef struct {
lsa_Name name; lsa_String name;
dom_sid2 *sid; dom_sid2 *sid;
} lsa_TrustInformation; } lsa_TrustInformation;
NTSTATUS lsa_CreateTrustedDomain( NTSTATUS lsa_CreateTrustedDomain(
@ -264,7 +264,7 @@
/* Function: 0x0d */ /* Function: 0x0d */
typedef struct { typedef struct {
lsa_Name name; lsa_String name;
dom_sid2 *sid; dom_sid2 *sid;
} lsa_DomainInformation; } lsa_DomainInformation;
@ -304,7 +304,7 @@
NTSTATUS lsa_LookupNames ( NTSTATUS lsa_LookupNames (
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
[in,range(0,1000)] uint32 num_names, [in,range(0,1000)] uint32 num_names,
[in,ref,size_is(num_names)] lsa_Name *names, [in,ref,size_is(num_names)] lsa_String *names,
[out] lsa_RefDomainList *domains, [out] lsa_RefDomainList *domains,
[in,out,ref] lsa_TransSidArray *sids, [in,out,ref] lsa_TransSidArray *sids,
[in] uint16 level, [in] uint16 level,
@ -317,7 +317,7 @@
typedef struct { typedef struct {
uint16 sid_type; uint16 sid_type;
lsa_Name name; lsa_String name;
uint32 sid_index; uint32 sid_index;
} lsa_TranslatedName; } lsa_TranslatedName;
@ -339,7 +339,7 @@
/* Function: 0x10 */ /* Function: 0x10 */
NTSTATUS lsa_CreateSecret( NTSTATUS lsa_CreateSecret(
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
[in] lsa_Name name, [in] lsa_String name,
[in] uint32 access_mask, [in] uint32 access_mask,
[out,ref] policy_handle *sec_handle [out,ref] policy_handle *sec_handle
); );
@ -405,25 +405,54 @@
[out,ref] policy_handle *trustdom_handle [out,ref] policy_handle *trustdom_handle
); );
typedef [flag(NDR_PAHEX)] struct {
uint32 length;
uint32 size;
[size_is(size),length_is(length)] uint8 *data;
} lsa_DATA_BUF;
typedef struct {
lsa_String domain_name;
} lsa_TrustDomainInfo1;
typedef struct {
uint32 flags;
} lsa_TrustDomainInfo3;
typedef struct {
lsa_String name;
lsa_String name2;
dom_sid2 *sid;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
} lsa_TrustDomainInfo6;
typedef union {
[case(1)] lsa_TrustDomainInfo1 info1;
[case(3)] lsa_TrustDomainInfo3 info3;
[case(6)] lsa_TrustDomainInfo6 info6;
} lsa_TrustedDomainInfo;
/* Function: 0x1a */ /* Function: 0x1a */
NTSTATUS lsa_QueryInfoTrustedDomain(); NTSTATUS lsa_QueryInfoTrustedDomain(
[in,ref] policy_handle *trustdom_handle,
[in] uint16 level,
[out,switch_is(level)] lsa_TrustedDomainInfo *info
);
/* Function: 0x1b */ /* Function: 0x1b */
NTSTATUS lsa_SetInformationTrustedDomain(); NTSTATUS lsa_SetInformationTrustedDomain();
/* Function: 0x1c */ /* Function: 0x1c */
NTSTATUS lsa_OpenSecret( NTSTATUS lsa_OpenSecret(
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
[in] lsa_Name name, [in] lsa_String name,
[in] uint32 access_mask, [in] uint32 access_mask,
[out,ref] policy_handle *sec_handle [out,ref] policy_handle *sec_handle
); );
/* Function: 0x1d */ /* Function: 0x1d */
typedef [flag(NDR_PAHEX)] struct {
uint32 length;
uint32 size;
[size_is(size),length_is(length)] uint8 *data;
} lsa_DATA_BUF;
NTSTATUS lsa_SetSecret( NTSTATUS lsa_SetSecret(
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
@ -452,7 +481,7 @@
NTSTATUS lsa_LookupPrivName ( NTSTATUS lsa_LookupPrivName (
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
[in,ref] lsa_LUID *luid, [in,ref] lsa_LUID *luid,
[out] lsa_Name *name [out] lsa_String *name
); );
@ -460,8 +489,8 @@
/* Function: 0x21 */ /* Function: 0x21 */
NTSTATUS lsa_LookupPrivDisplayName ( NTSTATUS lsa_LookupPrivDisplayName (
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
[in,ref] lsa_Name *name, [in,ref] lsa_String *name,
[out] lsa_Name *disp_name, [out] lsa_String *disp_name,
/* see http://www.microsoft.com/globaldev/nlsweb/ for /* see http://www.microsoft.com/globaldev/nlsweb/ for
language definitions */ language definitions */
[in,out,ref] uint16 *language_id, [in,out,ref] uint16 *language_id,
@ -476,7 +505,7 @@
/* Function: 0x23 */ /* Function: 0x23 */
NTSTATUS lsa_EnumAccountsWithUserRight ( NTSTATUS lsa_EnumAccountsWithUserRight (
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
[in] lsa_Name *name, [in] lsa_String *name,
[out,ref] lsa_SidArray *sids [out,ref] lsa_SidArray *sids
); );
@ -487,7 +516,7 @@
typedef struct { typedef struct {
uint32 count; uint32 count;
[size_is(count)] lsa_Name *names; [size_is(count)] lsa_String *names;
} lsa_RightSet; } lsa_RightSet;
NTSTATUS lsa_EnumAccountRights ( NTSTATUS lsa_EnumAccountRights (
@ -575,7 +604,7 @@
/* Function 0x37 */ /* Function 0x37 */
NTSTATUS lsa_OpenTrustedDomainByName( NTSTATUS lsa_OpenTrustedDomainByName(
[in,ref] policy_handle *handle, [in,ref] policy_handle *handle,
[in] lsa_Name name, [in] lsa_String name,
[in] uint32 access_mask, [in] uint32 access_mask,
[out,ref] policy_handle *trustdom_handle [out,ref] policy_handle *trustdom_handle
); );

View File

@ -228,8 +228,8 @@ static NTSTATUS lsa_info_AccountDomain(struct lsa_policy_state *state, TALLOC_CT
return NT_STATUS_INTERNAL_DB_CORRUPTION; return NT_STATUS_INTERNAL_DB_CORRUPTION;
} }
info->name.name = samdb_result_string(res[0], "name", NULL); info->name.string = samdb_result_string(res[0], "name", NULL);
info->sid = samdb_result_dom_sid(mem_ctx, res[0], "objectSid"); info->sid = samdb_result_dom_sid(mem_ctx, res[0], "objectSid");
return NT_STATUS_OK; return NT_STATUS_OK;
} }
@ -250,11 +250,11 @@ static NTSTATUS lsa_info_DNS(struct lsa_policy_state *state, TALLOC_CTX *mem_ctx
return NT_STATUS_INTERNAL_DB_CORRUPTION; return NT_STATUS_INTERNAL_DB_CORRUPTION;
} }
info->name.name = samdb_result_string(res[0], "name", NULL); info->name.string = samdb_result_string(res[0], "name", NULL);
info->dns_domain.name = samdb_result_string(res[0], "dnsDomain", NULL); info->dns_domain.string = samdb_result_string(res[0], "dnsDomain", NULL);
info->dns_forest.name = samdb_result_string(res[0], "dnsDomain", NULL); info->dns_forest.string = samdb_result_string(res[0], "dnsDomain", NULL);
info->domain_guid = samdb_result_guid(res[0], "objectGUID"); info->domain_guid = samdb_result_guid(res[0], "objectGUID");
info->sid = samdb_result_dom_sid(mem_ctx, res[0], "objectSid"); info->sid = samdb_result_dom_sid(mem_ctx, res[0], "objectSid");
return NT_STATUS_OK; return NT_STATUS_OK;
} }
@ -436,12 +436,12 @@ static NTSTATUS lsa_LookupSids(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
r->out.names->count++; r->out.names->count++;
(*r->out.count)++; (*r->out.count)++;
r->out.names->names[i].sid_type = SID_NAME_UNKNOWN; r->out.names->names[i].sid_type = SID_NAME_UNKNOWN;
r->out.names->names[i].name.name = sid_str; r->out.names->names[i].name.string = sid_str;
r->out.names->names[i].sid_index = 0xFFFFFFFF; r->out.names->names[i].sid_index = 0xFFFFFFFF;
if (sid_str == NULL) { if (sid_str == NULL) {
r->out.names->names[i].name.name = "(SIDERROR)"; r->out.names->names[i].name.string = "(SIDERROR)";
status = STATUS_SOME_UNMAPPED; status = STATUS_SOME_UNMAPPED;
continue; continue;
} }
@ -462,7 +462,7 @@ static NTSTATUS lsa_LookupSids(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
/* see if we've already done this authority name */ /* see if we've already done this authority name */
for (j=0;j<r->out.domains->count;j++) { for (j=0;j<r->out.domains->count;j++) {
if (strcmp(authority_name, r->out.domains->domains[j].name.name) == 0) { if (strcmp(authority_name, r->out.domains->domains[j].name.string) == 0) {
break; break;
} }
} }
@ -474,8 +474,8 @@ static NTSTATUS lsa_LookupSids(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
if (r->out.domains == NULL) { if (r->out.domains == NULL) {
return NT_STATUS_NO_MEMORY; return NT_STATUS_NO_MEMORY;
} }
r->out.domains->domains[j].name.name = authority_name; r->out.domains->domains[j].name.string = authority_name;
r->out.domains->domains[j].sid = authority_sid; r->out.domains->domains[j].sid = authority_sid;
r->out.domains->count++; r->out.domains->count++;
} }
@ -503,9 +503,9 @@ static NTSTATUS lsa_LookupSids(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
continue; continue;
} }
r->out.names->names[i].sid_type = rtype; r->out.names->names[i].sid_type = rtype;
r->out.names->names[i].name.name = name; r->out.names->names[i].name.string = name;
r->out.names->names[i].sid_index = 0; r->out.names->names[i].sid_index = 0;
} }
return status; return status;

View File

@ -22,9 +22,9 @@
#include "includes.h" #include "includes.h"
#include "librpc/gen_ndr/ndr_lsa.h" #include "librpc/gen_ndr/ndr_lsa.h"
static void init_lsa_Name(struct lsa_Name *name, const char *s) static void init_lsa_String(struct lsa_String *name, const char *s)
{ {
name->name = s; name->string = s;
} }
static BOOL test_OpenPolicy(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) static BOOL test_OpenPolicy(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
@ -108,7 +108,7 @@ static BOOL test_LookupNames(struct dcerpc_pipe *p,
{ {
struct lsa_LookupNames r; struct lsa_LookupNames r;
struct lsa_TransSidArray sids; struct lsa_TransSidArray sids;
struct lsa_Name *names; struct lsa_String *names;
uint32_t count = 0; uint32_t count = 0;
NTSTATUS status; NTSTATUS status;
int i; int i;
@ -120,7 +120,7 @@ static BOOL test_LookupNames(struct dcerpc_pipe *p,
names = talloc(mem_ctx, tnames->count * sizeof(names[0])); names = talloc(mem_ctx, tnames->count * sizeof(names[0]));
for (i=0;i<tnames->count;i++) { for (i=0;i<tnames->count;i++) {
init_lsa_Name(&names[i], tnames->names[i].name.name); init_lsa_String(&names[i], tnames->names[i].name.string);
} }
r.in.handle = handle; r.in.handle = handle;
@ -350,7 +350,7 @@ static BOOL test_CreateTrustedDomain(struct dcerpc_pipe *p,
domsid = dom_sid_parse_talloc(mem_ctx, "S-1-5-21-97398-379795-12345"); domsid = dom_sid_parse_talloc(mem_ctx, "S-1-5-21-97398-379795-12345");
trustinfo.sid = domsid; trustinfo.sid = domsid;
init_lsa_Name(&trustinfo.name, "torturedomain"); init_lsa_String(&trustinfo.name, "torturedomain");
r.in.handle = handle; r.in.handle = handle;
r.in.info = &trustinfo; r.in.info = &trustinfo;
@ -396,7 +396,7 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
asprintf(&secname, "torturesecret-%u", (uint_t)random()); asprintf(&secname, "torturesecret-%u", (uint_t)random());
init_lsa_Name(&r.in.name, secname); init_lsa_String(&r.in.name, secname);
r.in.handle = handle; r.in.handle = handle;
r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
@ -640,7 +640,7 @@ static BOOL test_EnumAccounts(struct dcerpc_pipe *p,
static BOOL test_LookupPrivDisplayName(struct dcerpc_pipe *p, static BOOL test_LookupPrivDisplayName(struct dcerpc_pipe *p,
TALLOC_CTX *mem_ctx, TALLOC_CTX *mem_ctx,
struct policy_handle *handle, struct policy_handle *handle,
struct lsa_Name *priv_name) struct lsa_String *priv_name)
{ {
struct lsa_LookupPrivDisplayName r; struct lsa_LookupPrivDisplayName r;
NTSTATUS status; NTSTATUS status;
@ -648,7 +648,7 @@ static BOOL test_LookupPrivDisplayName(struct dcerpc_pipe *p,
terminals */ terminals */
uint16 language_id = (random() % 4) + 0x409; uint16 language_id = (random() % 4) + 0x409;
printf("testing LookupPrivDisplayName(%s)\n", priv_name->name); printf("testing LookupPrivDisplayName(%s)\n", priv_name->string);
r.in.handle = handle; r.in.handle = handle;
r.in.name = priv_name; r.in.name = priv_name;
@ -662,7 +662,7 @@ static BOOL test_LookupPrivDisplayName(struct dcerpc_pipe *p,
return False; return False;
} }
printf("%s -> \"%s\" (language 0x%x/0x%x)\n", printf("%s -> \"%s\" (language 0x%x/0x%x)\n",
priv_name->name, r.out.disp_name->name, priv_name->string, r.out.disp_name->string,
*r.in.language_id, *r.out.language_id); *r.in.language_id, *r.out.language_id);
return True; return True;
@ -671,7 +671,7 @@ static BOOL test_LookupPrivDisplayName(struct dcerpc_pipe *p,
static BOOL test_EnumAccountsWithUserRight(struct dcerpc_pipe *p, static BOOL test_EnumAccountsWithUserRight(struct dcerpc_pipe *p,
TALLOC_CTX *mem_ctx, TALLOC_CTX *mem_ctx,
struct policy_handle *handle, struct policy_handle *handle,
struct lsa_Name *priv_name) struct lsa_String *priv_name)
{ {
struct lsa_EnumAccountsWithUserRight r; struct lsa_EnumAccountsWithUserRight r;
struct lsa_SidArray sids; struct lsa_SidArray sids;
@ -679,7 +679,7 @@ static BOOL test_EnumAccountsWithUserRight(struct dcerpc_pipe *p,
ZERO_STRUCT(sids); ZERO_STRUCT(sids);
printf("testing EnumAccountsWithUserRight(%s)\n", priv_name->name); printf("testing EnumAccountsWithUserRight(%s)\n", priv_name->string);
r.in.handle = handle; r.in.handle = handle;
r.in.name = priv_name; r.in.name = priv_name;
@ -746,7 +746,7 @@ static BOOL test_EnumTrustDom(struct dcerpc_pipe *p,
NTSTATUS status; NTSTATUS status;
uint32_t resume_handle = 0; uint32_t resume_handle = 0;
struct lsa_DomainList domains; struct lsa_DomainList domains;
int i; int i,j;
BOOL ret = True; BOOL ret = True;
printf("\nTesting EnumTrustDom\n"); printf("\nTesting EnumTrustDom\n");
@ -777,6 +777,7 @@ static BOOL test_EnumTrustDom(struct dcerpc_pipe *p,
struct policy_handle trust_handle; struct policy_handle trust_handle;
struct policy_handle handle2; struct policy_handle handle2;
struct lsa_Close c; struct lsa_Close c;
int levels [] = {1, 3, 6};
trust.in.handle = handle; trust.in.handle = handle;
trust.in.sid = domains.domains[i].sid; trust.in.sid = domains.domains[i].sid;
@ -793,6 +794,20 @@ static BOOL test_EnumTrustDom(struct dcerpc_pipe *p,
c.in.handle = &trust_handle; c.in.handle = &trust_handle;
c.out.handle = &handle2; c.out.handle = &handle2;
for (j=1; j < ARRAY_SIZE(levels); j++) {
struct lsa_QueryInfoTrustedDomain q;
union lsa_TrustedDomainInfo info;
q.in.trustdom_handle = &trust_handle;
q.in.level = levels[j];
q.out.info = &info;
status = dcerpc_lsa_QueryInfoTrustedDomain(p, mem_ctx, &q);
if (!NT_STATUS_IS_OK(status)) {
printf("QueryInfoTrustedDomain level %d failed - %s\n",
j, nt_errstr(status));
ret = False;
}
}
status = dcerpc_lsa_Close(p, mem_ctx, &c); status = dcerpc_lsa_Close(p, mem_ctx, &c);
if (!NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status)) {
printf("Close of trusted doman failed - %s\n", nt_errstr(status)); printf("Close of trusted doman failed - %s\n", nt_errstr(status));
@ -813,7 +828,7 @@ static BOOL test_EnumTrustDom(struct dcerpc_pipe *p,
c.in.handle = &trust_handle; c.in.handle = &trust_handle;
c.out.handle = &handle2; c.out.handle = &handle2;
status = dcerpc_lsa_Close(p, mem_ctx, &c); status = dcerpc_lsa_Close(p, mem_ctx, &c);
if (!NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status)) {
printf("Close of trusted doman failed - %s\n", nt_errstr(status)); printf("Close of trusted doman failed - %s\n", nt_errstr(status));

View File

@ -706,7 +706,7 @@ static BOOL samsync_handle_secret(TALLOC_CTX *mem_ctx, struct samsync_state *sam
o.in.handle = samsync_state->lsa_handle; o.in.handle = samsync_state->lsa_handle;
o.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; o.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
o.in.name.name = name; o.in.name.string = name;
o.out.sec_handle = &sec_handle; o.out.sec_handle = &sec_handle;
status = dcerpc_lsa_OpenSecret(samsync_state->p_lsa, mem_ctx, &o); status = dcerpc_lsa_OpenSecret(samsync_state->p_lsa, mem_ctx, &o);
@ -781,6 +781,10 @@ static BOOL samsync_handle_trusted_domain(TALLOC_CTX *mem_ctx, struct samsync_st
struct samsync_trusted_domain *new = talloc_p(samsync_state, struct samsync_trusted_domain); struct samsync_trusted_domain *new = talloc_p(samsync_state, struct samsync_trusted_domain);
struct lsa_OpenTrustedDomain t; struct lsa_OpenTrustedDomain t;
struct policy_handle trustdom_handle; struct policy_handle trustdom_handle;
struct lsa_QueryInfoTrustedDomain q;
union lsa_TrustedDomainInfo info[4];
int levels [] = {1, 3};
int i;
new->name = talloc_reference(new, trusted_domain->domain_name.string); new->name = talloc_reference(new, trusted_domain->domain_name.string);
new->sid = talloc_reference(new, dom_sid); new->sid = talloc_reference(new, dom_sid);
@ -795,7 +799,21 @@ static BOOL samsync_handle_trusted_domain(TALLOC_CTX *mem_ctx, struct samsync_st
printf("OpenTrustedDomain failed - %s\n", nt_errstr(status)); printf("OpenTrustedDomain failed - %s\n", nt_errstr(status));
return False; return False;
} }
for (i=0; i< ARRAY_SIZE(levels); i++) {
q.in.trustdom_handle = &trustdom_handle;
q.in.level = levels[i];
q.out.info = &info[levels[i]];
status = dcerpc_lsa_QueryInfoTrustedDomain(samsync_state->p_lsa, mem_ctx, &q);
if (!NT_STATUS_IS_OK(status)) {
printf("QueryInfoTrustedDomain level %d failed - %s\n",
levels[i], nt_errstr(status));
return False;
}
}
TEST_STRING_EQUAL(info[1].info1.domain_name, trusted_domain->domain_name);
TEST_INT_EQUAL(info[3].info3.flags, trusted_domain->flags);
TEST_SEC_DESC_EQUAL(trusted_domain->sdbuf, lsa, &trustdom_handle); TEST_SEC_DESC_EQUAL(trusted_domain->sdbuf, lsa, &trustdom_handle);
DLIST_ADD(samsync_state->trusted_domains, new); DLIST_ADD(samsync_state->trusted_domains, new);
@ -868,7 +886,7 @@ static BOOL samsync_handle_account(TALLOC_CTX *mem_ctx, struct samsync_state *sa
return False; return False;
} }
for (j=0;j<account->privilege_entries; j++) { for (j=0;j<account->privilege_entries; j++) {
if (strcmp(r.out.name->name, account->privilege_name[j].string) == 0) { if (strcmp(r.out.name->string, account->privilege_name[j].string) == 0) {
found_priv_in_lsa[j] = True; found_priv_in_lsa[j] = True;
break; break;
} }