Changeset 134 for trunk/lib/regfi.c
- Timestamp:
- 01/16/09 13:36:04 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/regfi.c
r133 r134 3 3 * http://viewcvs.samba.org/cgi-bin/viewcvs.cgi/trunk/source/registry/regfio.c?rev=7470&view=auto 4 4 * 5 * Unix SMB/CIFS implementation. 6 * Windows NT registry parsing library 5 * Windows NT (and later) registry parsing library 7 6 * 8 7 * Copyright (C) 2005-2009 Timothy D. Morgan … … 226 225 227 226 228 char* regfi_sid2str( DOM_SID* sid)229 { 230 uint32 i, size = MAXSUBAUTHS*11 + 24;227 char* regfi_sid2str(WINSEC_DOM_SID* sid) 228 { 229 uint32 i, size = WINSEC_MAX_SUBAUTHS*11 + 24; 231 230 uint32 left = size; 232 231 uint8 comps = sid->num_auths; … … 236 235 return NULL; 237 236 238 if(comps > MAXSUBAUTHS)239 comps = MAXSUBAUTHS;237 if(comps > WINSEC_MAX_SUBAUTHS) 238 comps = WINSEC_MAX_SUBAUTHS; 240 239 241 240 left -= sprintf(ret_val, "S-%u-%u", sid->sid_rev_num, sid->id_auth[5]); … … 248 247 249 248 250 char* regfi_get_acl( SEC_ACL* acl)249 char* regfi_get_acl(WINSEC_ACL* acl) 251 250 { 252 251 uint32 i, extra, size = 0; … … 263 262 for (i = 0; i < acl->num_aces && !failed; i++) 264 263 { 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); 269 268 270 269 if(flags_str != NULL && perms_str != NULL … … 307 306 308 307 309 char* regfi_get_sacl( SEC_DESC *sec_desc)308 char* regfi_get_sacl(WINSEC_DESC *sec_desc) 310 309 { 311 310 if (sec_desc->sacl) … … 316 315 317 316 318 char* regfi_get_dacl( SEC_DESC *sec_desc)317 char* regfi_get_dacl(WINSEC_DESC *sec_desc) 319 318 { 320 319 if (sec_desc->dacl) … … 325 324 326 325 327 char* regfi_get_owner( SEC_DESC *sec_desc)326 char* regfi_get_owner(WINSEC_DESC *sec_desc) 328 327 { 329 328 return regfi_sid2str(sec_desc->owner_sid); … … 331 330 332 331 333 char* regfi_get_group( SEC_DESC *sec_desc)332 char* regfi_get_group(WINSEC_DESC *sec_desc) 334 333 { 335 334 return regfi_sid2str(sec_desc->grp_sid); … … 447 446 { 448 447 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) 451 455 return NULL; 452 456 … … 457 461 if(lists[i] == NULL) 458 462 { 459 ret_val->num_keys = 0; 460 break; 463 free(ret_val); 464 free(lists); 465 return NULL; 461 466 } 462 467 ret_val->num_keys += lists[i]->num_keys; … … 469 474 * ret_val->num_keys); 470 475 k=0; 476 471 477 if(ret_val->elements != NULL) 472 478 { … … 498 504 REGF_SUBKEY_LIST** sublists; 499 505 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; 501 507 uint8* hashes; 502 508 uint8 buf[REGFI_SUBKEY_LIST_MIN_LEN]; … … 541 547 sublists[i] = regfi_load_subkeylist(file, off, 0, max_length, strict); 542 548 } 543 549 free(hashes); 550 544 551 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; 545 562 } 546 563 … … 551 568 ret_val->offset = offset; 552 569 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 561 570 ret_val->magic[0] = buf[0]; 562 571 ret_val->magic[1] = buf[1]; … … 579 588 580 589 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)); 586 600 if(ret_val->elements == NULL) 587 601 { … … 599 613 600 614 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) 602 616 { 603 617 free(ret_val->elements); … … 606 620 } 607 621 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 } 612 637 } 613 638 free(hashes); … … 623 648 { 624 649 REGF_SK_REC* ret_val; 650 uint8* sec_desc_buf; 625 651 uint32 cell_length, length; 626 prs_struct ps;652 /*prs_struct ps;*/ 627 653 uint8 sk_header[REGFI_SK_MIN_LENGTH]; 628 654 bool unalloc = false; 629 630 655 631 656 if(!regfi_parse_cell(file->fd, offset, sk_header, REGFI_SK_MIN_LENGTH, … … 674 699 * code depends on the ps structure. 675 700 */ 701 /* 676 702 if(!prs_init(&ps, ret_val->desc_size, NULL, UNMARSHALL)) 677 703 { … … 687 713 return NULL; 688 714 } 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);*/ 699 741 700 742 return ret_val; … … 893 935 off = nk->subkeys_off + REGF_BLOCKSIZE; 894 936 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, 896 938 max_length, true); 939 897 940 if(nk->subkeys == NULL) 898 941 {
Note: See TracChangeset
for help on using the changeset viewer.