Browse Source

.probe: Add more safeguards to prevent crashes

in case of wrong user input
due to obtain empty lines in shared ngspice
pre-master-46
Holger Vogt 4 years ago
parent
commit
aaf586ae83
  1. 2
      examples/probe/mos-test.cir
  2. 42
      src/frontend/inpc_probe.c

2
examples/probe/mos-test.cir

@ -17,7 +17,7 @@ mp1 out in dd dd pm
.probe i(mp1:s) i(mn1:s) v(in) v(out) vd(mn1:d:s) vd(mp1:1, mn1:1) .probe i(mp1:s) i(mn1:s) v(in) v(out) vd(mn1:d:s) vd(mp1:1, mn1:1)
* buggy inputs * buggy inputs
.probe i(mn1:z) vd(mp1:0:0) vd(mp1:1:1) hhhh) i(:u) VD(z) i(())
.probe i(mn1:z) vd(mp1:0:0) vd(mp1:1:1) hhhh) i(:u) VD(z) i(()) vd(:0:0) i(:z)
.save @mn1[id] .save @mn1[id]

42
src/frontend/inpc_probe.c

@ -129,11 +129,15 @@ void inp_probe(struct card* deck)
continue; continue;
if (*curr_line == '.') if (*curr_line == '.')
continue; continue;
if (*curr_line == '\0')
continue;
/* here we should go on with only true device instances at top level. /* here we should go on with only true device instances at top level.
Put all instance names as key into a hash table, with the address as parameter. */ Put all instance names as key into a hash table, with the address as parameter. */
/* Get the instance name as key */ /* Get the instance name as key */
char* instname = gettok_instance(&curr_line); char* instname = gettok_instance(&curr_line);
if (!instname)
continue;
nghash_insert(instances, instname, card); nghash_insert(instances, instname, card);
} }
@ -175,8 +179,12 @@ void inp_probe(struct card* deck)
continue; continue;
if (*curr_line == '.') if (*curr_line == '.')
continue; continue;
if (*curr_line == '\0')
continue;
char* instname = gettok_instance(&curr_line); char* instname = gettok_instance(&curr_line);
if (!instname)
continue;
/* select elements not in need of a measure Vsource */ /* select elements not in need of a measure Vsource */
if (strchr("evihk", *instname)) if (strchr("evihk", *instname))
@ -192,6 +200,14 @@ void inp_probe(struct card* deck)
strnode1 = gettok(&thisline); strnode1 = gettok(&thisline);
strnode2 = gettok(&thisline); strnode2 = gettok(&thisline);
if (!strnode2 || *strnode2 == '\0') {
fprintf(stderr, "Warning: Cannot read 2 nodes in line %s\n", curr_line);
fprintf(stderr, " Instance not ready for .probe command\n");
tfree(strnode1);
tfree(strnode2);
continue;
}
nodename2 = get_terminal_name(instname, "2", instances); nodename2 = get_terminal_name(instname, "2", instances);
char* newnode = tprintf("int_%s_%s", strnode2, instname); char* newnode = tprintf("int_%s_%s", strnode2, instname);
@ -220,6 +236,12 @@ void inp_probe(struct card* deck)
char* thisnode; char* thisnode;
char nodebuf[20]; char nodebuf[20];
thisnode = gettok(&thisline); thisnode = gettok(&thisline);
if (!thisnode || *thisnode == '\0') {
fprintf(stderr, "Warning: Cannot read node %d in line %s\n", i, curr_line);
fprintf(stderr, " Instance not ready for .probe command\n");
tfree(thisnode);
continue;
}
char* newnode = tprintf("int_%s_%s_%d", thisnode, instname, i); char* newnode = tprintf("int_%s_%s_%d", thisnode, instname, i);
sadd(&dnewline, newnode); sadd(&dnewline, newnode);
cadd(&dnewline, ' '); cadd(&dnewline, ' ');
@ -239,9 +261,6 @@ void inp_probe(struct card* deck)
allsaves = wl_cons(nodesaves, allsaves); allsaves = wl_cons(nodesaves, allsaves);
} }
tfree(newnode); tfree(newnode);
tfree(nodename); tfree(nodename);
} }
@ -331,6 +350,13 @@ void inp_probe(struct card* deck)
thisline = nexttok(thisline); /* skip instance name */ thisline = nexttok(thisline); /* skip instance name */
strnode1 = gettok(&thisline); strnode1 = gettok(&thisline);
strnode2 = gettok(&thisline); strnode2 = gettok(&thisline);
if (!strnode2 || *strnode2 == '\0') {
fprintf(stderr, "Warning: Cannot read 2 nodes in line %s\n", tmpcard1->line);
fprintf(stderr, " Instance not ready for .probe command\n");
tfree(strnode1);
tfree(strnode2);
continue;
}
newline = tprintf("Ediff%d_%s vd_%s 0 %s %s 1", ee, instname1, instname1, strnode1, strnode2); newline = tprintf("Ediff%d_%s vd_%s 0 %s %s 1", ee, instname1, instname1, strnode1, strnode2);
char* nodesaves = tprintf("vd_%s", instname1); char* nodesaves = tprintf("vd_%s", instname1);
@ -347,7 +373,12 @@ void inp_probe(struct card* deck)
else { else {
char* tmpstr2, *nodename1, *nodename2; char* tmpstr2, *nodename1, *nodename2;
struct card* tmpcard2; struct card* tmpcard2;
tmpstr2 = tmpstr;
instname1 = gettok_char(&tmpstr, ':', FALSE, FALSE); instname1 = gettok_char(&tmpstr, ':', FALSE, FALSE);
if (!instname1) {
fprintf(stderr, "Warning: Cannot read instance name in %s, ignored\n");
continue;
}
tmpcard1 = nghash_find(instances, instname1); tmpcard1 = nghash_find(instances, instname1);
if (!tmpcard1) { if (!tmpcard1) {
fprintf(stderr, "Warning: Could not find the instance line for %s,\n .probe %s will be ignored\n", instname1, wltmp->wl_word); fprintf(stderr, "Warning: Could not find the instance line for %s,\n .probe %s will be ignored\n", instname1, wltmp->wl_word);
@ -367,6 +398,11 @@ void inp_probe(struct card* deck)
tmpstr2++; /* beyond ',' */ tmpstr2++; /* beyond ',' */
instname2 = gettok_char(&tmpstr2, ':', FALSE, FALSE); instname2 = gettok_char(&tmpstr2, ':', FALSE, FALSE);
if (!instname2) {
fprintf(stderr, "Warning: Cannot read instance name in %s, ignored\n", tmpstr);
tfree(nodename1);
continue;
}
tmpstr2++; /* beyond ':' */ tmpstr2++; /* beyond ':' */
tmpcard2 = nghash_find(instances, instname2); tmpcard2 = nghash_find(instances, instname2);
if (!tmpcard2) { if (!tmpcard2) {

Loading…
Cancel
Save