1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-05 21:57:51 +03:00

Begin to handle Security descriptors for keys.

This commit is contained in:
Richard Sharpe -
parent bbb0b2ee40
commit eca76f2f66

View File

@ -889,6 +889,99 @@ int valid_regf_hdr(REGF_HDR *regf_hdr)
return 1;
}
/*
* Process an SK header ...
* Every time we see a new one, add it to the map. Otherwise, just look it up.
* We will do a simple linear search for the moment, since many KEYs have the
* same security descriptor.
* We allocate the map in increments of 10 entries.
*/
KEY_SEC_DESC *lookup_sec_key(SK_MAP *sk_map, int count, int sk_off)
{
int i;
if (!sk_map) return NULL;
for (i = 0; i < count; i++) {
if (sk_map[i].sk_off == sk_off)
return sk_map[i].key_sec_desc;
}
return NULL;
}
KEY_SEC_DESC *process_sk(REGF *regf, SK_HDR *sk_hdr, int sk_off, int size)
{
KEY_SEC_DESC *tmp = NULL;
if (!sk_hdr) return NULL;
if (SVAL(&sk_hdr->SK_ID) != REG_SK_ID) {
fprintf(stderr, "Unrecognized SK Header ID: %08X, %s\n", (int)sk_hdr,
regf->regfile_name);
return NULL;
}
/*
* Now, we need to look up the SK Record in the map, and return it
* Since the map contains the SK_OFF mapped to KEY_SEC_DESC, we can
* use that
*/
if ((tmp = lookup_sec_key(*regf->sk_map, regf->sk_count, sk_off)) != NULL) {
tmp->ref_cnt++;
return tmp;
}
/*
* Now, allocate a KEY_SEC_DESC, and parse the structure here, and add the
* new KEY_SEC_DESC to the mapping structure, since the offset supplied is
* the actual offset of structure. The same offset will be used by all
* all future references to this structure
*/
tmp = (KEY_SEC_DESC *)malloc(sizeof(KEY_SEC_DESC));
if (!tmp) return NULL;
tmp->ref_cnt++;
if (!regf->sk_map) { /* Allocate a block of 10 */
regf->sk_map = (SK_MAP **)malloc(sizeof(SK_MAP) * 10);
if (!regf->sk_map) {
free(tmp);
return NULL;
}
regf->sk_map_size = 10;
regf->sk_count = 1;
(*regf->sk_map)[0].sk_off = sk_off;
(*regf->sk_map)[0].key_sec_desc = tmp;
}
else { /* Simply allocate a new slot, unless we have to expand the list */
int index = regf->sk_count;
if (regf->sk_count == regf->sk_map_size) {
regf->sk_map = (SK_MAP **)realloc(regf->sk_map, regf->sk_map_size + 10);
if (!regf->sk_map) {
free(tmp);
return NULL;
}
index++;
}
(*regf->sk_map)[index].sk_off = sk_off;
(*regf->sk_map)[index].key_sec_desc = tmp;
regf->sk_count++;
}
/*
* Now, process the actual sec desc and plug the values in
*/
return tmp;
}
/*
* Process a VK header and return a value
*/
@ -982,6 +1075,8 @@ VAL_LIST *process_vl(REGF *regf, VL_TYPE vl, int count, int size)
VK_HDR *vk_hdr;
VAL_LIST *tmp = NULL;
if (!vl) return NULL;
if (-size < (count+1)*sizeof(int)){
fprintf(stderr, "Error in VL header format. Size less than space required. %d\n", -size);
return NULL;