Browse Source

Fix memory leaks in ff/latch code.

pre-master-46
Brian Taylor 4 years ago
committed by Holger Vogt
parent
commit
bd00738a49
  1. 48
      src/frontend/inpcom.c
  2. 28
      src/frontend/udevices.c

48
src/frontend/inpcom.c

@ -8313,7 +8313,6 @@ static struct card *u_instances(struct card *startcard)
int udev_ok = 0, udev_not_ok = 0; int udev_ok = 0, udev_not_ok = 0;
BOOL create_called = FALSE, repeat_pass = FALSE; BOOL create_called = FALSE, repeat_pass = FALSE;
BOOL skip_next = FALSE; BOOL skip_next = FALSE;
char *tmp = NULL, *pos, *posp, *new_str = NULL;
card = startcard; card = startcard;
while (card) { while (card) {
@ -8336,35 +8335,36 @@ static struct card *u_instances(struct card *startcard)
} }
initialize_udevice(subcktcard->line); initialize_udevice(subcktcard->line);
create_called = TRUE; create_called = TRUE;
} else {
/* Pspice definition of .subckt card:
.SUBCKT <name> [node]*
+ [OPTIONAL: < <interface node> = <default value> >*]
+ [PARAMS: < <name> = <value> >* ]
+ [TEXT: < <name> = <text value> >* ]
...
.ENDS
*/
tmp = TMALLOC(char, strlen(cut_line) + 1);
(void) memcpy(tmp, cut_line, strlen(cut_line) + 1);
pos = strstr(tmp, "optional:");
posp = strstr(tmp, "params:");
/* If there is an optional: and a param: then posp > pos */
if (pos) {
/* Remove the optional: section if present */
*pos = '\0';
if (posp) {
strcat(tmp, posp);
}
}
new_str = copy(tmp);
tfree(tmp);
} }
} else if (ciprefix(".ends", cut_line)) { } else if (ciprefix(".ends", cut_line)) {
level--; level--;
if (repeat_pass) { if (repeat_pass) {
newcard = replacement_udevice_cards(); newcard = replacement_udevice_cards();
if (newcard) { if (newcard) {
char *tmp = NULL, *pos, *posp, *new_str = NULL, *cl;
/* Pspice definition of .subckt card:
.SUBCKT <name> [node]*
+ [OPTIONAL: < <interface node> = <default value> >*]
+ [PARAMS: < <name> = <value> >* ]
+ [TEXT: < <name> = <text value> >* ]
...
.ENDS
*/
cl = subcktcard->line;
tmp = TMALLOC(char, strlen(cl) + 1);
(void) memcpy(tmp, cl, strlen(cl) + 1);
pos = strstr(tmp, "optional:");
posp = strstr(tmp, "params:");
/* If there is an optional: and a param: then posp > pos */
if (pos) {
/* Remove the optional: section if present */
*pos = '\0';
if (posp) {
strcat(tmp, posp);
}
}
new_str = copy(tmp);
tfree(tmp);
remove_old_cards(subcktcard->nextcard, card); remove_old_cards(subcktcard->nextcard, card);
subcktcard->nextcard = newcard; subcktcard->nextcard = newcard;
tfree(subcktcard->line); tfree(subcktcard->line);

28
src/frontend/udevices.c

@ -2766,16 +2766,16 @@ static struct dff_instance *add_dff_inout_timing_model(
arrp = dffip->d_in; arrp = dffip->d_in;
for (i = 0; i < num_gates; i++) { for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0) { if (strncmp(arrp[i], "$d_", 3) == 0) {
tfree(dffip);
delete_dff_instance(dffip);
return NULL; return NULL;
} }
} }
if (eq(dffip->prebar, "$d_lo") || eq(dffip->prebar, "$d_nc")) { if (eq(dffip->prebar, "$d_lo") || eq(dffip->prebar, "$d_nc")) {
tfree(dffip);
delete_dff_instance(dffip);
return NULL; return NULL;
} }
if (eq(dffip->clrbar, "$d_lo") || eq(dffip->clrbar, "$d_nc")) { if (eq(dffip->clrbar, "$d_lo") || eq(dffip->clrbar, "$d_nc")) {
tfree(dffip);
delete_dff_instance(dffip);
return NULL; return NULL;
} }
@ -2841,20 +2841,20 @@ static struct dltch_instance *add_dltch_inout_timing_model(
arrp = dlp->d_in; arrp = dlp->d_in;
for (i = 0; i < num_gates; i++) { for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0) { if (strncmp(arrp[i], "$d_", 3) == 0) {
tfree(dlp);
delete_dltch_instance(dlp);
return NULL; return NULL;
} }
} }
if (strncmp(dlp->gate, "$d_", 3) == 0) { if (strncmp(dlp->gate, "$d_", 3) == 0) {
tfree(dlp);
delete_dltch_instance(dlp);
return NULL; return NULL;
} }
if (eq(dlp->prebar, "$d_lo") || eq(dlp->prebar, "$d_nc")) { if (eq(dlp->prebar, "$d_lo") || eq(dlp->prebar, "$d_nc")) {
tfree(dlp);
delete_dltch_instance(dlp);
return NULL; return NULL;
} }
if (eq(dlp->clrbar, "$d_lo") || eq(dlp->clrbar, "$d_nc")) { if (eq(dlp->clrbar, "$d_lo") || eq(dlp->clrbar, "$d_nc")) {
tfree(dlp);
delete_dltch_instance(dlp);
return NULL; return NULL;
} }
return dlp; return dlp;
@ -2930,16 +2930,16 @@ static struct jkff_instance *add_jkff_inout_timing_model(
for (i = 0; i < num_gates; i++) { for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0 || if (strncmp(arrp[i], "$d_", 3) == 0 ||
strncmp(arrpk[i], "$d_", 3) == 0) { strncmp(arrpk[i], "$d_", 3) == 0) {
tfree(jkffip);
delete_jkff_instance(jkffip);
return NULL; return NULL;
} }
} }
if (eq(jkffip->prebar, "$d_lo") || eq(jkffip->prebar, "$d_nc")) { if (eq(jkffip->prebar, "$d_lo") || eq(jkffip->prebar, "$d_nc")) {
tfree(jkffip);
delete_jkff_instance(jkffip);
return NULL; return NULL;
} }
if (eq(jkffip->clrbar, "$d_lo") || eq(jkffip->clrbar, "$d_nc")) { if (eq(jkffip->clrbar, "$d_lo") || eq(jkffip->clrbar, "$d_nc")) {
tfree(jkffip);
delete_jkff_instance(jkffip);
return NULL; return NULL;
} }
return jkffip; return jkffip;
@ -3019,20 +3019,20 @@ static struct srff_instance *add_srff_inout_timing_model(
for (i = 0; i < num_gates; i++) { for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0 || if (strncmp(arrp[i], "$d_", 3) == 0 ||
strncmp(arrpr[i], "$d_", 3) == 0) { strncmp(arrpr[i], "$d_", 3) == 0) {
tfree(srffp);
delete_srff_instance(srffp);
return NULL; return NULL;
} }
} }
if (strncmp(srffp->gate, "$d_", 3) == 0) { if (strncmp(srffp->gate, "$d_", 3) == 0) {
tfree(srffp);
delete_srff_instance(srffp);
return NULL; return NULL;
} }
if (eq(srffp->prebar, "$d_lo") || eq(srffp->prebar, "$d_nc")) { if (eq(srffp->prebar, "$d_lo") || eq(srffp->prebar, "$d_nc")) {
tfree(srffp);
delete_srff_instance(srffp);
return NULL; return NULL;
} }
if (eq(srffp->clrbar, "$d_lo") || eq(srffp->clrbar, "$d_nc")) { if (eq(srffp->clrbar, "$d_lo") || eq(srffp->clrbar, "$d_nc")) {
tfree(srffp);
delete_srff_instance(srffp);
return NULL; return NULL;
} }
return srffp; return srffp;

Loading…
Cancel
Save