Browse Source

plotting/grid.c, bug fix, avoid string buffer overflow

Prevent a crash of example/FFT_test.cir.
Buffer 'buf' in function drawlingrid() has been too small.
Increase 'buf' size, and add some protection.

The example file examples/plot/test-small-plot.cir
shows the limits of plotting:
  difference in two numbers at digit 14 is plotted well.
                            at digit 15 is plotted with bugs.
                            at digit 16 is reduced to integer.

consider compiling with
  -O1 -D_FORTIFY_SOURCE=2
for gcc, and
  /GS
for visual studio.
pre-master-46
Holger Vogt 8 years ago
committed by rlar
parent
commit
560cb6e970
  1. 116
      examples/plot/test-small-plot.cir
  2. 20
      src/frontend/plotting/grid.c
  3. 2
      src/include/ngspice/graph.h

116
examples/plot/test-small-plot.cir

@ -0,0 +1,116 @@
resolution test for plotting
.control
let xvar = vector(4)
let yvar = vector(4)
* --------------------
* integer
let yvar[0] = 1.0
let yvar[1] = 1.0
let yvar[2] = 1.0
let yvar[3] = 1.0
plot yvar vs xvar title integer 1
* --------------------
* 14 digits
let yvar[0] = 1.0
let yvar[1] = 1.00000000000001
let yvar[2] = 0.99999999999999
let yvar[3] = 1.0
plot yvar vs xvar title '14 digits'
* --------------------
* 15 digits
let yvar[0] = 1.0
let yvar[1] = 1.000000000000001
let yvar[2] = 0.999999999999999
let yvar[3] = 1.0
plot yvar vs xvar title '15 digits'
* --------------------
* 16 digits
let yvar[0] = 1.0
let yvar[1] = 1.0000000000000001
let yvar[2] = 0.9999999999999999
let yvar[3] = 1.0
plot yvar vs xvar title '16 digits'
* --------------------
* 14 digits plus exponent
let yvar[0] = 1.0e-14
let yvar[1] = 1.00000000000001e-14
let yvar[2] = 0.99999999999999e-14
let yvar[3] = 1.0e-14
plot yvar vs xvar title '14 digits plus exponent'
* --------------------
* 15 digits plus exponent
let yvar[0] = 1.0e-14
let yvar[1] = 1.000000000000001e-14
let yvar[2] = 0.999999999999999e-14
let yvar[3] = 1.0e-14
plot yvar vs xvar title '15 digits plus exponent'
* --------------------
* 16 digits plus exponent
let yvar[0] = 1.0e-14
let yvar[1] = 1.0000000000000001e-14
let yvar[2] = 0.9999999999999999e-14
let yvar[3] = 1.0e-14
plot yvar vs xvar title '16 digits plus exponent'
* --------------------
* negative 14 digits plus exponent
let yvar[0] = -1.0e-14
let yvar[1] = -1.00000000000001e-14
let yvar[2] = -0.99999999999999e-14
let yvar[3] = -1.0e-14
plot yvar vs xvar title 'neg 14 digits plus exponent'
* --------------------
* negative 15 digits plus exponent
let yvar[0] = -1.0e-14
let yvar[1] = -1.000000000000001e-14
let yvar[2] = -0.999999999999999e-14
let yvar[3] = -1.0e-14
plot yvar vs xvar title 'neg 15 digits plus exponent'
* --------------------
* negative 16 digits plus exponent
let yvar[0] = -1.0e-14
let yvar[1] = -1.0000000000000001e-14
let yvar[2] = -0.9999999999999999e-14
let yvar[3] = -1.0e-14
plot yvar vs xvar title 'neg 16 digits plus exponent'
* --------------------
* 15 digits plus big exponent
let yvar[0] = 1.0e-200
let yvar[1] = 1.000000000000001e-200
let yvar[2] = 0.999999999999999e-200
let yvar[3] = 1.0e-200
plot yvar vs xvar title '15 digits plus big exponent'
* --------------------
* negative 15 digits plus big exponent
let yvar[0] = -1.0e-200
let yvar[1] = -1.000000000000001e-200
let yvar[2] = -0.999999999999999e-200
let yvar[3] = -1.0e-200
plot yvar vs xvar title 'neg 15 digits plus big exponent'
.endc
.end

20
src/frontend/plotting/grid.c

@ -365,10 +365,10 @@ lingrid(GRAPH *graph, double lo, double hi, double delta, int type, Axis axis)
buf[0] = '\0'; buf[0] = '\0';
} }
if ((s = ft_typabbrev(type)) != NULL)
(void) strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
else
(void) strncat(buf, "Units", sizeof(buf) - strlen(buf) - 1);
s = ft_typabbrev(type);
if (!s)
s = "Units";
strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
if (delta == 0.0) { if (delta == 0.0) {
int i; int i;
@ -527,7 +527,7 @@ drawlingrid(GRAPH *graph, char *units, int spacing, int nsp, double dst, double
if (j == 0) if (j == 0)
SetLinestyle(1); SetLinestyle(1);
(void) sprintf(buf, "%.*f", digits + 1, m * mag / 100.0);
snprintf(buf, sizeof(buf), "%.*f", digits + 1, m * mag / 100.0);
if (axis == x_axis) if (axis == x_axis)
DevDrawText(buf, graph->viewportxoff + i - DevDrawText(buf, graph->viewportxoff + i -
@ -629,10 +629,12 @@ loggrid(GRAPH *graph, double lo, double hi, int type, Axis axis)
dd[0] = pow(10.0, (double) lmt); dd[0] = pow(10.0, (double) lmt);
dd[1] = pow(10.0, (double) hmt); dd[1] = pow(10.0, (double) hmt);
if ((s = ft_typabbrev(type)) != NULL)
(void) strcpy(buf, s);
else
(void) strcpy(buf, "Units");
buf[0] = '\0';
s = ft_typabbrev(type);
if (!s)
s = "Units";
strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
if (axis == x_axis) { if (axis == x_axis) {
(void) strcpy(graph->grid.xaxis.log.units, buf); (void) strcpy(graph->grid.xaxis.log.units, buf);

2
src/include/ngspice/graph.h

@ -17,7 +17,7 @@ Author: 1988 Jeffrey M. Hsu
struct _keyed; struct _keyed;
#define GRAPH_UNITS_LENGTH 16
#define GRAPH_UNITS_LENGTH 20
/* Device-independent data structure for plots. */ /* Device-independent data structure for plots. */

Loading…
Cancel
Save