From 1baba94cd1838811642606ac035cd0e3de69e2b8 Mon Sep 17 00:00:00 2001 From: pnenzi Date: Fri, 20 Aug 2004 09:34:55 +0000 Subject: [PATCH] Vera's patch to close "show +" and similar constructs segfault. --- src/frontend/device.c | 43 +++++++++++++++---------------------------- src/frontend/gens.c | 20 +++++++++++--------- src/frontend/gens.h | 7 ++++--- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/frontend/device.c b/src/frontend/device.c index cd29ddd5c..f1b9701b8 100644 --- a/src/frontend/device.c +++ b/src/frontend/device.c @@ -73,7 +73,7 @@ all_show(wordlist *wl, int mode) if (!cp_getvar("width", VT_NUM, (char *) &screen_width)) screen_width = DEF_WIDTH; - count = (screen_width - LEFT_WIDTH) / (DEV_WIDTH + 1); + count = (screen_width - LEFT_WIDTH) / (DEV_WIDTH + 1); n = 0; do { @@ -101,10 +101,7 @@ all_show(wordlist *wl, int mode) else thisgroup = next; } - /* - tfree(w->wl_word); - tfree(w); - */ + /* w must not be freed here */ w = NULL; } else if (eq(w->wl_word, "+")) { if (params) { @@ -120,16 +117,10 @@ all_show(wordlist *wl, int mode) else thisgroup = next; } - /* - tfree(w->wl_word); - tfree(w); - */ + /* w must not be freed here */ w = NULL; } else if (eq(w->wl_word, ":")) { - /* - tfree(w->wl_word); - tfree(w); - */ + /* w must not be freed here */ w = NULL; if (!params) { params = next; @@ -145,10 +136,7 @@ all_show(wordlist *wl, int mode) } } else if (eq(w->wl_word, ";") || eq(w->wl_word, ",")) { nextgroup = next; - /* - tfree(w->wl_word); - tfree(w); - */ + /* w must not be freed here */ w = NULL; if (prev) prev->wl_next = NULL; @@ -180,7 +168,7 @@ all_show(wordlist *wl, int mode) if (ft_sim->devices[dg->dev_type_no]->numModelParms) { i = 0; do { - printf("%*s", LEFT_WIDTH, "model"); + printf("%*s", LEFT_WIDTH, "model"); j = dgen_for_n(dg, count, printstr, "m", i); i += 1; printf("\n"); @@ -193,7 +181,7 @@ all_show(wordlist *wl, int mode) else if (!params) param_forall(dg, DGEN_DEFPARAMS); if (params) - wl_forall(params, listparam, (void *)dg); + wl_forall(params, listparam, dg); printf("\n"); } else if (ft_sim->devices[dg->dev_type_no]->numModelParms) { @@ -215,7 +203,7 @@ all_show(wordlist *wl, int mode) else if (!params) param_forall(dg, DGEN_DEFPARAMS); if (params) - wl_forall(params, listparam, (void *)dg); + wl_forall(params, listparam, dg); printf("\n"); } } @@ -254,7 +242,7 @@ printstr(dgen *dg, char *name) return 0; } -void +void param_forall(dgen *dg, int flags) { int i, j, k, found; @@ -286,8 +274,7 @@ param_forall(dgen *dg, int flags) plist[i].keyword); else printf("%*.*s", LEFT_WIDTH, LEFT_WIDTH, " "); - k = dgen_for_n(dg, count, printvals, - (char *) (plist + i), j); + k = dgen_for_n(dg, count, printvals, (plist + i), j); printf("\n"); j += 1; } while (k); @@ -296,7 +283,7 @@ param_forall(dgen *dg, int flags) } } -void +void listparam(wordlist *p, dgen *dg) { int i, j, k, found; @@ -331,7 +318,7 @@ listparam(wordlist *p, dgen *dg) printf("%*.*s", LEFT_WIDTH, LEFT_WIDTH, p->wl_word); else printf("%*.*s", LEFT_WIDTH, LEFT_WIDTH, " "); - k = dgen_for_n(dg, count, printvals, (void *)(plist + i), j); + k = dgen_for_n(dg, count, printvals, (plist + i), j); printf("\n"); j += 1; } while (k > 0); @@ -462,7 +449,7 @@ printvals(dgen *dg, IFparm *p, int i) /* (old "show" command) - * Display various device parameters. The syntax of this command is + * Display various device parameters. The syntax of this command is * show devicelist : parmlist * where devicelist can be "all", the name of a device, a string like r*, * which means all devices with names that begin with 'r', repeated one @@ -495,7 +482,7 @@ old_show(wordlist *wl) inp_casefix(devs->wl_word); tw = wl_append(tw, devexpand(devs->wl_word)); } - + devs = tw; for (tw = parms; tw; tw = tw->wl_next) if (eq(tw->wl_word, "all")) @@ -571,7 +558,7 @@ com_altermod(wordlist *wl) com_alter_common(wl, 1); } -void +void com_alter_common(wordlist *wl, int do_model) { wordlist *eqword, *words; diff --git a/src/frontend/gens.c b/src/frontend/gens.c index dab0c0a45..ac9725199 100644 --- a/src/frontend/gens.c +++ b/src/frontend/gens.c @@ -27,7 +27,7 @@ wl_forall(wordlist *wl, void (*fn) (/* ??? */), void *data) dgen * dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model) { - dgen *dg; + dgen *dg, *dg_save; wordlist **prevp; dg = NEW(dgen); @@ -37,6 +37,7 @@ dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model) dg->dev_type_no = -1; dg->dev_list = wl; dg->flags = 0; + dg_save = dg; /* va: save, to avoid memory leak */ prevp = &wl; @@ -51,6 +52,8 @@ dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model) dg->flags |= DGEN_DEFDEVS | flag; dgen_next(&dg); + /* va: it might be too much tests, but safer is better... */ + if (dg!=dg_save && dg==NULL && dg_save!=NULL) tfree(dg_save); return dg; } @@ -79,18 +82,17 @@ dgen_for_n(dgen *dg, int n, int (*fn) (/* ??? */), void *data, int subindex) } void -dgen_nth_next(dgen **dg, int n) +dgen_nth_next(dgen **p_dg, int n) { int i, dnum; - dgen * dg_old=*dg; + dgen * dg_save=*p_dg; /* va: save, to avoid memory leak */ + dnum = (*p_dg)->dev_type_no; - dnum = (*dg)->dev_type_no; - - for (i = 0; *dg && (*dg)->dev_type_no == dnum && i < n; i++) { - dgen_next(dg); - /* va, it might be too much tests, but safer is better... */ - if (*dg!=dg_old && *dg==NULL && dg_old!=NULL) tfree(dg_old); + for (i = 0; *p_dg && (*p_dg)->dev_type_no == dnum && i < n; i++) { + dgen_next(p_dg); + /* va: it might be too much tests, but safer is better... */ + if (*p_dg!=dg_save && *p_dg==NULL && dg_save!=NULL) tfree(dg_save); } } diff --git a/src/frontend/gens.h b/src/frontend/gens.h index dd4848f45..10d6a3c80 100644 --- a/src/frontend/gens.h +++ b/src/frontend/gens.h @@ -6,11 +6,12 @@ #ifndef GENS_H_INCLUDED #define GENS_H_INCLUDED -void wl_forall(wordlist *wl, void (*fn) (/* ??? */), void *data); +#include "dgen.h" + +void wl_forall(wordlist *wl, void (*fn)(/* ??? */), void *data); dgen * dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model); int dgen_for_n(dgen *dg, int n, int (*fn) (/* ??? */), void *data, int subindex); void dgen_nth_next(dgen **dg, int n); - -#endif +#endif /* GENS_H_INCLUDED */ \ No newline at end of file