Example #1
0
def declare_double_linked_list_type(structType, forward, backward):
    ''' declare a double linked list type.
  '''
    # test existence
    flinkType = getattr(structType, forward)
    blinkType = getattr(structType, backward)
    d = dict(structType.getFields())
    flinkType = d[forward]
    blinkType = d[backward]
    if not utils.isPointerType(flinkType):
        raise TypeError('The %s field is not a pointer.' % (forward))
    if not utils.isPointerType(blinkType):
        raise TypeError('The %s field is not a pointer.' % (backward))

    #XXX
    from haystack import model

    def iterateList(self, mappings):
        ''' iterate forward, then backward, until null or duplicate '''
        done = [0]
        obj = self
        #print 'going forward '
        for fieldname in [forward, backward]:
            link = getattr(obj, fieldname)
            addr = utils.getaddress(link)
            log.debug('iterateList got a <%s>/0x%x' %
                      (link.__class__.__name__, addr))
            nb = 0
            while addr not in done:
                #print '%x %s'%(addr, addr in done)
                done.append(addr)
                memoryMap = utils.is_valid_address_value(
                    addr, mappings, structType)
                if memoryMap == False:
                    raise ValueError(
                        'the link of this linked list has a bad value')
                st = memoryMap.readStruct(addr, structType)
                model.keepRef(st, structType, addr)
                log.debug("keepRefx2 %s.%s @%x" %
                          (structType, fieldname, addr))
                yield addr
                # next
                link = getattr(st, fieldname)
                addr = utils.getaddress(link)
            #print 'going backward after %x'%(addr)
        raise StopIteration

    def loadMembers(self, mappings, depth):
        # should not be called, field typed as non loadable.
        log.debug('- <%s> loadMembers return TRUE' % (structType.__name__))
        return True

    # set iterator on the list structure
    structType._iterateList = iterateList
    structType.loadMembers = loadMembers
    log.debug(
        '%s has beed fitted with a list iterator self._iterateList(mappings)' %
        (structType))
    return
Example #2
0
def declare_double_linked_list_type( structType, forward, backward):
  ''' declare a double linked list type.
  '''
  # test existence
  flinkType = getattr(structType, forward) 
  blinkType = getattr(structType, backward)
  d = dict(structType.getFields())
  flinkType = d[forward]
  blinkType = d[backward]
  if not utils.isPointerType(flinkType):
    raise TypeError('The %s field is not a pointer.'%(forward))
  if not utils.isPointerType(blinkType):
    raise TypeError('The %s field is not a pointer.'%(backward))

  #XXX 
  from haystack import model
  def iterateList(self, mappings):
    ''' iterate forward, then backward, until null or duplicate '''    
    done = [0]
    obj = self
    #print 'going forward '
    for fieldname in [forward, backward]:
      link = getattr(obj, fieldname)
      addr = utils.getaddress(link)
      log.debug('iterateList got a <%s>/0x%x'%(link.__class__.__name__,addr))
      nb=0
      while addr not in done:
        #print '%x %s'%(addr, addr in done)
        done.append(addr)
        memoryMap = utils.is_valid_address_value( addr, mappings, structType)
        if memoryMap == False:
          raise ValueError('the link of this linked list has a bad value')
        st = memoryMap.readStruct( addr, structType)
        model.keepRef(st, structType, addr)
        log.debug("keepRefx2 %s.%s @%x"%(structType, fieldname, addr  ))
        yield addr
        # next
        link = getattr(st, fieldname)
        addr = utils.getaddress(link)
      #print 'going backward after %x'%(addr)
    raise StopIteration
  
  def loadMembers(self, mappings, depth):
    # should not be called, field typed as non loadable.
    log.debug('- <%s> loadMembers return TRUE'%(structType.__name__))
    return True
    
  # set iterator on the list structure
  structType._iterateList = iterateList
  structType.loadMembers = loadMembers
  log.debug('%s has beed fitted with a list iterator self._iterateList(mappings)'%(structType))
  return
Example #3
0
  def test_keepRef(self):
    self.assertNotEqual( self.mappings, None )
      
    for fname, ftype in self.heap_obj.getFields():
      attr = getattr(self.heap_obj, fname)
      if isCStringPointer(ftype):
        # ignore that - attr_addr = getaddress(attr.ptr)
        continue
      elif isPointerType(ftype):
        attr_addr = getaddress(attr)
      else:
        continue
      if attr_addr == 0:
        continue
      self.assertTrue( utils.is_valid_address_value(attr_addr, self.mappings), '%s: 0x%x is not valid'%(fname, attr_addr))
      # the book should register struct type, not pointer to strut type
      attr_type = model.get_subtype(ftype)
      # look in the books
      saved = model.getRefByAddr( attr_addr )
      _class, _addr, _obj = saved[0]

      self.assertEquals( attr_addr, _addr)
      self.assertEquals( attr_type, _class, '%s != %s' %(type(ftype), type(_class)))
      self.assertTrue( model.hasRef( model.get_subtype(ftype), attr_addr))
    
    return      
Example #4
0
    def test_keepRef(self):
        self.assertNotEqual(self.mappings, None)

        for fname, ftype in self.heap_obj.getFields():
            attr = getattr(self.heap_obj, fname)
            if isCStringPointer(ftype):
                # ignore that - attr_addr = getaddress(attr.ptr)
                continue
            elif isPointerType(ftype):
                attr_addr = getaddress(attr)
            else:
                continue
            if attr_addr == 0:
                continue
            self.assertTrue(
                utils.is_valid_address_value(attr_addr, self.mappings),
                '%s: 0x%x is not valid' % (fname, attr_addr))
            # the book should register struct type, not pointer to strut type
            attr_type = model.get_subtype(ftype)
            # look in the books
            saved = model.getRefByAddr(attr_addr)
            _class, _addr, _obj = saved[0]

            self.assertEquals(attr_addr, _addr)
            self.assertEquals(attr_type, _class,
                              '%s != %s' % (type(ftype), type(_class)))
            self.assertTrue(model.hasRef(model.get_subtype(ftype), attr_addr))

        return
Example #5
0
def check_varname_for_type(varname, structType):
  done = []
  st = structType
  from haystack import model
  for v in varname:
    if not hasattr(st, v):
      fields = ["%s: %s"%(n,t) for n,t in st.getFields()]
      log.error('(%s.)%s does not exists in type %s\n\t%s'%('.'.join(done), v, st, '\n\t'.join(fields)) )
      return False
    st = st.getFieldType(v)
    if utils.isPointerType(st): # accept pointers
      st = model.get_subtype(st)
    done.append(v)
  return True
Example #6
0
def check_varname_for_type(varname, structType):
    done = []
    st = structType
    from haystack import model
    for v in varname:
        if not hasattr(st, v):
            fields = ["%s: %s" % (n, t) for n, t in st.getFields()]
            log.error('(%s.)%s does not exists in type %s\n\t%s' %
                      ('.'.join(done), v, st, '\n\t'.join(fields)))
            return False
        st = st.getFieldType(v)
        if utils.isPointerType(st):  # accept pointers
            st = model.get_subtype(st)
        done.append(v)
    return True