Esempio n. 1
0
void NCValidateSegment(uint8_t *mbase, NaClPcAddress vbase, NaClMemorySize sz,
                       struct NCValidatorState *vstate) {
  /* Sanity checks */
  /* TODO(ncbray): remove redundant vbase/size args. */
  if ((vbase & vstate->bundle_mask) != 0) {
    ValidatePrintOffsetError(0, "Bad vbase alignment", vstate);
    NCStatsSegFault(vstate);
    return;
  }
  if (vbase != vstate->iadrbase) {
    ValidatePrintOffsetError(0, "Mismatched vbase addresses", vstate);
    NCStatsSegFault(vstate);
    return;
  }
  if (sz != vstate->codesize) {
    ValidatePrintOffsetError(0, "Mismatched code size", vstate);
    NCStatsSegFault(vstate);
    return;
  }

  sz = NCHaltTrimSize(mbase, sz, vstate->bundle_size);
  vstate->codesize = sz;

  if (sz == 0) {
    ValidatePrintOffsetError(0, "Bad text segment (zero size)", vstate);
    NCStatsSegFault(vstate);
    return;
  }
  NCValidateDStateInit(vstate, mbase, vbase, sz);
  NCDecoderStateDecode(&vstate->dstate);
  NCDecoderStateDestruct(&vstate->dstate);
}
void NCDecodeSegment(uint8_t* mbase, NaClPcAddress vbase,
                     NaClMemorySize size) {
  NCDecoderInst inst;
  NCDecoderState dstate;
  NCDecoderStateConstruct(&dstate, mbase, vbase, size, &inst, 1);
  NCDecoderStateSetErrorReporter(&dstate, &kNCVerboseErrorReporter);
  /* TODO(karl): Fix this so that we don't need to override the
   * action function.
   */
  dstate.action_fn = PrintInstLogGio;
  NCDecoderStateDecode(&dstate);
  NCDecoderStateDestruct(&dstate);
}