From 417d109764df476cb4a6869be72ea1f110fafd08 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 27 Aug 2012 00:12:14 +0200 Subject: [PATCH] resask.c: avoid segfault if @R[i] is asked before analysis is run --- src/spicelib/devices/res/resask.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/res/resask.c b/src/spicelib/devices/res/resask.c index f0a3c2435..3588f07a2 100644 --- a/src/spicelib/devices/res/resask.c +++ b/src/spicelib/devices/res/resask.c @@ -139,28 +139,43 @@ RESask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, errRtn = "RESask"; strcpy(errMsg, msg); return(E_ASKCURRENT); - } else { + } else if (ckt->CKTrhsOld) { value->rValue = (*(ckt->CKTrhsOld + fast->RESposNode) - *(ckt->CKTrhsOld + fast->RESnegNode)) *fast->RESconduct; value->rValue *= fast->RESm; + return(OK); + } else { + char msgloc[BSIZE_SP]; + sprintf(msgloc, "No current values available for %s", fast->RESname); + errMsg = TMALLOC(char, strlen(msgloc) + 1); + errRtn = "RESask"; + strcpy(errMsg, msgloc); + return(E_ASKCURRENT); } - return(OK); case RES_POWER: if (ckt->CKTcurrentAnalysis & DOING_AC) { errMsg = TMALLOC(char, strlen(msg) + 1); errRtn = "RESask"; strcpy(errMsg, msg); return(E_ASKPOWER); - } else { + } else if (ckt->CKTrhsOld) { value->rValue = (*(ckt->CKTrhsOld + fast->RESposNode) - *(ckt->CKTrhsOld + fast->RESnegNode)) * fast->RESconduct * (*(ckt->CKTrhsOld + fast->RESposNode) - *(ckt->CKTrhsOld + fast->RESnegNode)); value->rValue *= fast->RESm; + return(OK); + } else { + char msgloc[BSIZE_SP]; + sprintf(msgloc, "No power values available for %s", fast->RESname); + errMsg = TMALLOC(char, strlen(msgloc) + 1); + errRtn = "RESask"; + strcpy(errMsg, msgloc); + return(E_ASKCURRENT); } - return(OK); + default: return(E_BADPARM); }