Ignore:
Timestamp:
05/04/08 14:29:02 (16 years ago)
Author:
tim
Message:

fixed some VK record parsing bugs

added more strict checking on unallocated ranges

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/reglookup-recover.c

    r112 r113  
    418418
    419419
    420 bool removeRange(range_list* rl, uint32 rm_idx, uint32 offset, uint32 length)
    421 {
    422   const range_list_element* cur_elem = range_list_get(rl, rm_idx);
    423  
     420bool removeRange(range_list* rl, uint32 offset, uint32 length)
     421{
     422  int32 rm_idx;
     423  const range_list_element* cur_elem;
     424 
     425  rm_idx = range_list_find(rl, offset);
     426  if(rm_idx < 0)
     427    return false;
     428
     429  cur_elem = range_list_get(rl, rm_idx);
    424430  if(cur_elem == NULL)
    425431  {
     
    481487        }
    482488       
    483         if(!removeRange(unalloc_cells, i, key->offset, key->cell_size))
     489        if(!removeRange(unalloc_cells, key->offset, key->cell_size))
    484490          return 30;
    485491      }
     
    499505  const range_list_element* cur_elem;
    500506  uint32 i, j, num_keys, off, values_length, max_length;
    501   int32 idx;
    502507
    503508  num_keys=range_list_size(unalloc_keys);
     
    529534        if(nk->values != NULL)
    530535        {
    531           idx = range_list_find(unalloc_cells, off);
    532           if(idx < 0)
     536          if(!range_list_has_range(unalloc_cells, off, nk->cell_size))
    533537          { /* We've parsed a values-list which isn't in the unallocated list,
    534538             * so prune it.
     
    553557            if(values_length != (values_length & 0xFFFFFFF8))
    554558              values_length = (values_length & 0xFFFFFFF8) + 8;
    555             if(!removeRange(unalloc_cells, idx, off, values_length))
     559
     560            if(!removeRange(unalloc_cells, off, values_length))
    556561              return 20;
    557562
     
    560565              if(nk->values[j] != NULL)
    561566              {
    562                 idx = range_list_find(unalloc_cells, nk->values[j]->offset);
    563                 if(idx < 0)
     567                if(!range_list_has_range(unalloc_cells, nk->values[j]->offset,
     568                                         nk->values[j]->cell_size))
    564569                { /* We've parsed a value which isn't in the unallocated list,
    565570                   * so prune it.
     
    575580                   * and inspect data.
    576581                   */
    577                   if(!removeRange(unalloc_cells, idx, nk->values[j]->offset,
     582                  if(!removeRange(unalloc_cells, nk->values[j]->offset,
    578583                                  nk->values[j]->cell_size))
    579584                    return 21;
    580585
    581586                  /* Don't bother pruning or removing from unalloc_cells if
    582                    * there is no data, if it is stored the offset.
     587                   * there is no data, or it is stored in the offset.
    583588                   */
    584589                  if(nk->values[j]->data != NULL && !nk->values[j]->data_in_offset)
    585590                  {
    586591                    off = nk->values[j]->data_off+REGF_BLOCKSIZE;
    587                     idx = range_list_find(unalloc_cells, off);
    588                     if(idx < 0)
     592                    if(!range_list_has_range(unalloc_cells, off,
     593                                             nk->values[j]->data_size))
    589594                    { /* We've parsed a data cell which isn't in the unallocated
    590595                       * list, so prune it.
     
    595600                    else
    596601                    { /*A data record was recovered. Remove from unalloc_cells.*/
    597                       if(!removeRange(unalloc_cells, idx, off,
     602                      if(!removeRange(unalloc_cells, off,
    598603                                      nk->values[j]->data_size))
    599604                        return 22;
     
    638643        }
    639644       
    640         if(!removeRange(unalloc_cells, i, vk->offset, vk->cell_size))
     645        if(!removeRange(unalloc_cells, vk->offset, vk->cell_size))
    641646          return 30;
    642647      }
     
    672677        }
    673678       
    674         if(!removeRange(unalloc_cells, i, sk->offset, sk->cell_size))
     679        if(!removeRange(unalloc_cells, sk->offset, sk->cell_size))
    675680          return 30;
    676681      }
Note: See TracChangeset for help on using the changeset viewer.