Changeset 134 for trunk/lib/regfi.c


Ignore:
Timestamp:
01/16/09 13:36:04 (15 years ago)
Author:
tim
Message:

rewrote winsec library, stripping out Samba dependencies

eliminated remaining Samba prs functions

added support for 'li' subkey list records

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/regfi.c

    r133 r134  
    33 *   http://viewcvs.samba.org/cgi-bin/viewcvs.cgi/trunk/source/registry/regfio.c?rev=7470&view=auto
    44 *
    5  * Unix SMB/CIFS implementation.
    6  * Windows NT registry parsing library
     5 * Windows NT (and later) registry parsing library
    76 *
    87 * Copyright (C) 2005-2009 Timothy D. Morgan
     
    226225
    227226
    228 char* regfi_sid2str(DOM_SID* sid)
    229 {
    230   uint32 i, size = MAXSUBAUTHS*11 + 24;
     227char* regfi_sid2str(WINSEC_DOM_SID* sid)
     228{
     229  uint32 i, size = WINSEC_MAX_SUBAUTHS*11 + 24;
    231230  uint32 left = size;
    232231  uint8 comps = sid->num_auths;
     
    236235    return NULL;
    237236
    238   if(comps > MAXSUBAUTHS)
    239     comps = MAXSUBAUTHS;
     237  if(comps > WINSEC_MAX_SUBAUTHS)
     238    comps = WINSEC_MAX_SUBAUTHS;
    240239
    241240  left -= sprintf(ret_val, "S-%u-%u", sid->sid_rev_num, sid->id_auth[5]);
     
    248247
    249248
    250 char* regfi_get_acl(SEC_ACL* acl)
     249char* regfi_get_acl(WINSEC_ACL* acl)
    251250{
    252251  uint32 i, extra, size = 0;
     
    263262  for (i = 0; i < acl->num_aces && !failed; i++)
    264263  {
    265     sid_str = regfi_sid2str(&acl->ace[i].trustee);
    266     type_str = regfi_ace_type2str(acl->ace[i].type);
    267     perms_str = regfi_ace_perms2str(acl->ace[i].info.mask);
    268     flags_str = regfi_ace_flags2str(acl->ace[i].flags);
     264    sid_str = regfi_sid2str(acl->aces[i]->trustee);
     265    type_str = regfi_ace_type2str(acl->aces[i]->type);
     266    perms_str = regfi_ace_perms2str(acl->aces[i]->access_mask);
     267    flags_str = regfi_ace_flags2str(acl->aces[i]->flags);
    269268   
    270269    if(flags_str != NULL && perms_str != NULL
     
    307306
    308307
    309 char* regfi_get_sacl(SEC_DESC *sec_desc)
     308char* regfi_get_sacl(WINSEC_DESC *sec_desc)
    310309{
    311310  if (sec_desc->sacl)
     
    316315
    317316
    318 char* regfi_get_dacl(SEC_DESC *sec_desc)
     317char* regfi_get_dacl(WINSEC_DESC *sec_desc)
    319318{
    320319  if (sec_desc->dacl)
     
    325324
    326325
    327 char* regfi_get_owner(SEC_DESC *sec_desc)
     326char* regfi_get_owner(WINSEC_DESC *sec_desc)
    328327{
    329328  return regfi_sid2str(sec_desc->owner_sid);
     
    331330
    332331
    333 char* regfi_get_group(SEC_DESC *sec_desc)
     332char* regfi_get_group(WINSEC_DESC *sec_desc)
    334333{
    335334  return regfi_sid2str(sec_desc->grp_sid);
     
    447446{
    448447  uint32 i,j,k;
    449   REGF_SUBKEY_LIST* ret_val = (REGF_SUBKEY_LIST*)zalloc(sizeof(REGF_SUBKEY_LIST));
    450   if(ret_val == NULL || lists == NULL)
     448  REGF_SUBKEY_LIST* ret_val;
     449
     450  if(lists == NULL)
     451    return NULL;
     452  ret_val = (REGF_SUBKEY_LIST*)zalloc(sizeof(REGF_SUBKEY_LIST));
     453
     454  if(ret_val == NULL)
    451455    return NULL;
    452456 
     
    457461    if(lists[i] == NULL)
    458462    {
    459       ret_val->num_keys = 0;
    460       break;
     463      free(ret_val);
     464      free(lists);
     465      return NULL;
    461466    }
    462467    ret_val->num_keys += lists[i]->num_keys;
     
    469474                                     * ret_val->num_keys);
    470475    k=0;
     476
    471477    if(ret_val->elements != NULL)
    472478    {
     
    498504  REGF_SUBKEY_LIST** sublists;
    499505  REGF_HBIN* sublist_hbin;
    500   uint32 i, cell_length, length, num_sublists, off, max_length;
     506  uint32 i, cell_length, length, num_sublists, off, max_length, elem_size;
    501507  uint8* hashes;
    502508  uint8 buf[REGFI_SUBKEY_LIST_MIN_LEN];
     
    541547      sublists[i] = regfi_load_subkeylist(file, off, 0, max_length, strict);
    542548    }
    543    
     549    free(hashes);
     550
    544551    return regfi_merge_subkeylists(num_sublists, sublists, strict);
     552  }
     553
     554  if(buf[0] == 'l' && buf[1] == 'i')
     555    elem_size = sizeof(uint32);
     556  else if((buf[0] == 'l') && (buf[1] == 'f' || buf[1] == 'h'))
     557    elem_size = sizeof(REGF_SUBKEY_LIST_ELEM);
     558  else
     559  {
     560    /* fprintf(stderr, "DEBUG: lf->header=%c%c\n", buf[0], buf[1]);*/
     561    return NULL;
    545562  }
    546563
     
    551568  ret_val->offset = offset;
    552569  ret_val->cell_size = cell_length;
    553 
    554   if((buf[0] != 'l' || buf[1] != 'f') && (buf[0] != 'l' || buf[1] != 'h'))
    555   {
    556     /*printf("DEBUG: lf->header=%c%c\n", buf[0], buf[1]);*/
    557     free(ret_val);
    558     return NULL;
    559   }
    560 
    561570  ret_val->magic[0] = buf[0];
    562571  ret_val->magic[1] = buf[1];
     
    579588
    580589  if(cell_length - REGFI_SUBKEY_LIST_MIN_LEN - sizeof(uint32)
    581      < ret_val->num_keys*sizeof(REGF_SUBKEY_LIST_ELEM))
    582     return NULL;
    583 
    584   length = sizeof(REGF_SUBKEY_LIST_ELEM)*ret_val->num_keys;
    585   ret_val->elements = (REGF_SUBKEY_LIST_ELEM*)zalloc(length);
     590     < ret_val->num_keys*elem_size)
     591  {
     592    free(ret_val);
     593    return NULL;
     594  }
     595
     596  length = elem_size*ret_val->num_keys;
     597  ret_val->elements
     598    = (REGF_SUBKEY_LIST_ELEM*)zalloc(ret_val->num_keys
     599                                     * sizeof(REGF_SUBKEY_LIST_ELEM));
    586600  if(ret_val->elements == NULL)
    587601  {
     
    599613
    600614  if(regfi_read(file->fd, hashes, &length) != 0
    601      || length != sizeof(REGF_SUBKEY_LIST_ELEM)*ret_val->num_keys)
     615     || length != elem_size*ret_val->num_keys)
    602616  {
    603617    free(ret_val->elements);
     
    606620  }
    607621
    608   for (i=0; i < ret_val->num_keys; i++)
    609   {
    610     ret_val->elements[i].nk_off = IVAL(hashes, i*sizeof(REGF_SUBKEY_LIST_ELEM));
    611     ret_val->elements[i].hash = IVAL(hashes, i*sizeof(REGF_SUBKEY_LIST_ELEM)+4);
     622  if(buf[0] == 'l' && buf[1] == 'i')
     623  {
     624    for (i=0; i < ret_val->num_keys; i++)
     625    {
     626      ret_val->elements[i].nk_off = IVAL(hashes, i*elem_size);
     627      ret_val->elements[i].hash = 0;
     628    }
     629  }
     630  else
     631  {
     632    for (i=0; i < ret_val->num_keys; i++)
     633    {
     634      ret_val->elements[i].nk_off = IVAL(hashes, i*elem_size);
     635      ret_val->elements[i].hash = IVAL(hashes, i*elem_size+4);
     636    }
    612637  }
    613638  free(hashes);
     
    623648{
    624649  REGF_SK_REC* ret_val;
     650  uint8* sec_desc_buf;
    625651  uint32 cell_length, length;
    626   prs_struct ps;
     652  /*prs_struct ps;*/
    627653  uint8 sk_header[REGFI_SK_MIN_LENGTH];
    628654  bool unalloc = false;
    629 
    630655
    631656  if(!regfi_parse_cell(file->fd, offset, sk_header, REGFI_SK_MIN_LENGTH,
     
    674699   * code depends on the ps structure.
    675700   */
     701  /*
    676702  if(!prs_init(&ps, ret_val->desc_size, NULL, UNMARSHALL))
    677703  {
     
    687713    return NULL;
    688714  }
    689 
    690   /* XXX: call should look more like: */
    691   /*if (!(ret_val->sec_desc = winsec_parse_desc(sec_desc_buf, ret_val->desc_size)))*/
    692   if (!sec_io_desc("sec_desc", &ret_val->sec_desc, &ps, 0))
    693   {
    694     free(ret_val);
    695     return NULL;
    696   }
    697 
    698   free(ps.data_p);
     715  */
     716
     717  sec_desc_buf = (uint8*)zalloc(ret_val->desc_size);
     718  if(ret_val == NULL)
     719  {
     720    free(ret_val);
     721    return NULL;
     722  }
     723
     724  length = ret_val->desc_size;
     725  if(regfi_read(file->fd, sec_desc_buf, &length) != 0
     726     || length != ret_val->desc_size)
     727  {
     728    free(ret_val);
     729    return NULL;
     730  }
     731
     732  if(!(ret_val->sec_desc = winsec_parse_desc(sec_desc_buf, ret_val->desc_size)))
     733  {
     734    free(sec_desc_buf);
     735    free(ret_val);
     736    return NULL;
     737  }
     738  free(sec_desc_buf);
     739
     740  /*  free(ps.data_p);*/
    699741
    700742  return ret_val;
     
    893935      off = nk->subkeys_off + REGF_BLOCKSIZE;
    894936      max_length = sub_hbin->block_size + sub_hbin->file_off - off;
    895       nk->subkeys = regfi_load_subkeylist(file, off, nk->num_subkeys, 
     937      nk->subkeys = regfi_load_subkeylist(file, off, nk->num_subkeys,
    896938                                          max_length, true);
     939
    897940      if(nk->subkeys == NULL)
    898941      {
Note: See TracChangeset for help on using the changeset viewer.