Fix double free in XSPICE CALLBACK functions as desribed here:
https://sourceforge.net/p/ngspice/mailman/message/37677362/ and add missing CALLBACKs in models that use STATIC_VARs with pointer values.
This commit is contained in:
parent
2406846a21
commit
659b426cf8
|
|
@ -51,6 +51,7 @@ NON-STANDARD FEATURES
|
||||||
/*=== INCLUDE FILES ====================*/
|
/*=== INCLUDE FILES ====================*/
|
||||||
|
|
||||||
#include "oneshot.h"
|
#include "oneshot.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -85,6 +86,20 @@ typedef struct {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
oneshot_callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
|
{
|
||||||
|
switch (reason) {
|
||||||
|
case MIF_CB_DESTROY: {
|
||||||
|
Local_Data_t *loc = STATIC_VAR (locdata);
|
||||||
|
if (loc) {
|
||||||
|
free(loc);
|
||||||
|
STATIC_VAR (locdata) = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
|
|
@ -253,6 +268,7 @@ void cm_oneshot(ARGS) /* structure holding parms,
|
||||||
/*** allocate static storage for *loc ***/
|
/*** allocate static storage for *loc ***/
|
||||||
STATIC_VAR (locdata) = calloc (1 , sizeof ( Local_Data_t ));
|
STATIC_VAR (locdata) = calloc (1 , sizeof ( Local_Data_t ));
|
||||||
loc = STATIC_VAR (locdata);
|
loc = STATIC_VAR (locdata);
|
||||||
|
CALLBACK = oneshot_callback;
|
||||||
|
|
||||||
/* Allocate storage for breakpoint domain & pulse width values */
|
/* Allocate storage for breakpoint domain & pulse width values */
|
||||||
x = loc->control = (double *) calloc((size_t) cntl_size, sizeof(double));
|
x = loc->control = (double *) calloc((size_t) cntl_size, sizeof(double));
|
||||||
|
|
|
||||||
|
|
@ -232,9 +232,12 @@ cm_pwl_callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
double *last_x_value = STATIC_VAR (last_x_value);
|
double *last_x_value = STATIC_VAR (last_x_value);
|
||||||
double *x = STATIC_VAR (x);
|
double *x = STATIC_VAR (x);
|
||||||
double *y = STATIC_VAR (y);
|
double *y = STATIC_VAR (y);
|
||||||
free(last_x_value);
|
if (last_x_value)
|
||||||
free(x);
|
free(last_x_value);
|
||||||
free(y);
|
if (x)
|
||||||
|
free(x);
|
||||||
|
if (y)
|
||||||
|
free(y);
|
||||||
STATIC_VAR (last_x_value) = NULL;
|
STATIC_VAR (last_x_value) = NULL;
|
||||||
STATIC_VAR (x) = NULL;
|
STATIC_VAR (x) = NULL;
|
||||||
STATIC_VAR (y) = NULL;
|
STATIC_VAR (y) = NULL;
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,20 @@ NON-STANDARD FEATURES
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
genlut_callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
|
{
|
||||||
|
switch (reason) {
|
||||||
|
case MIF_CB_DESTROY: {
|
||||||
|
Digital_t *loc = STATIC_VAR (locdata);
|
||||||
|
if (loc) {
|
||||||
|
free(loc);
|
||||||
|
STATIC_VAR (locdata) = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
|
|
@ -170,6 +184,7 @@ void cm_d_genlut(ARGS)
|
||||||
/* allocate storage for the lookup table */
|
/* allocate storage for the lookup table */
|
||||||
STATIC_VAR (locdata) = calloc((size_t) tablelen, sizeof(Digital_t));
|
STATIC_VAR (locdata) = calloc((size_t) tablelen, sizeof(Digital_t));
|
||||||
lookup_table = STATIC_VAR (locdata);
|
lookup_table = STATIC_VAR (locdata);
|
||||||
|
CALLBACK = genlut_callback;
|
||||||
|
|
||||||
/* allocate storage for the outputs */
|
/* allocate storage for the outputs */
|
||||||
cm_event_alloc(0, osize * (int) sizeof(Digital_t));
|
cm_event_alloc(0, osize * (int) sizeof(Digital_t));
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,20 @@ NON-STANDARD FEATURES
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
lut_callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
|
{
|
||||||
|
switch (reason) {
|
||||||
|
case MIF_CB_DESTROY: {
|
||||||
|
Digital_State_t *loc = STATIC_VAR (locdata);
|
||||||
|
if (loc) {
|
||||||
|
free(loc);
|
||||||
|
STATIC_VAR (locdata) = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
|
|
@ -136,6 +150,7 @@ void cm_d_lut(ARGS)
|
||||||
/* allocate storage for the lookup table */
|
/* allocate storage for the lookup table */
|
||||||
STATIC_VAR (locdata) = calloc((size_t) tablelen, sizeof(Digital_State_t));
|
STATIC_VAR (locdata) = calloc((size_t) tablelen, sizeof(Digital_State_t));
|
||||||
lookup_table = STATIC_VAR (locdata);
|
lookup_table = STATIC_VAR (locdata);
|
||||||
|
CALLBACK = lut_callback;
|
||||||
|
|
||||||
/* allocate storage for the outputs */
|
/* allocate storage for the outputs */
|
||||||
cm_event_alloc(0, sizeof(Digital_State_t));
|
cm_event_alloc(0, sizeof(Digital_State_t));
|
||||||
|
|
|
||||||
|
|
@ -1592,6 +1592,7 @@ static void callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
if (table->next_state)
|
if (table->next_state)
|
||||||
free(table->next_state);
|
free(table->next_state);
|
||||||
free(table);
|
free(table);
|
||||||
|
STATIC_VAR(table) = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,10 @@ cm_pswitch_callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case MIF_CB_DESTROY: {
|
case MIF_CB_DESTROY: {
|
||||||
Local_Data_t *loc = STATIC_VAR (locdata);
|
Local_Data_t *loc = STATIC_VAR (locdata);
|
||||||
free(loc);
|
if (loc) {
|
||||||
|
free(loc);
|
||||||
|
STATIC_VAR (locdata) = NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,10 @@ cm_sidiode_callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case MIF_CB_DESTROY: {
|
case MIF_CB_DESTROY: {
|
||||||
Local_Data_t *loc = STATIC_VAR (locdata);
|
Local_Data_t *loc = STATIC_VAR (locdata);
|
||||||
free(loc);
|
if (loc) {
|
||||||
|
free(loc);
|
||||||
|
STATIC_VAR (locdata) = NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ NON-STANDARD FEATURES
|
||||||
/*=== INCLUDE FILES ====================*/
|
/*=== INCLUDE FILES ====================*/
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -70,6 +71,20 @@ NON-STANDARD FEATURES
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
cm_zener_callback(ARGS, Mif_Callback_Reason_t reason)
|
||||||
|
{
|
||||||
|
switch (reason) {
|
||||||
|
case MIF_CB_DESTROY: {
|
||||||
|
double *loc = STATIC_VAR(previous_voltage);
|
||||||
|
if (loc) {
|
||||||
|
free(loc);
|
||||||
|
STATIC_VAR(previous_voltage) = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
|
|
@ -180,6 +195,7 @@ void cm_zener(ARGS) /* structure holding parms,
|
||||||
/* Set previous_voltage value to zero... */
|
/* Set previous_voltage value to zero... */
|
||||||
*previous_voltage = 0.0;
|
*previous_voltage = 0.0;
|
||||||
|
|
||||||
|
CALLBACK = cm_zener_callback;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue