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); }