Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Jul 2005 19:16:16 -0500 (CDT)
From:      Dan Nelson <dnelson@allantgroup.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/82909: [PATCH] fix ministat -s with >2 datasets
Message-ID:  <200507030016.j630GGE5088630@dan.emsphone.com>
Resent-Message-ID: <200507030030.j630UwX6015191@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         82909
>Category:       bin
>Synopsis:       [PATCH] fix ministat -s with >2 datasets
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jul 03 00:30:58 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Dan Nelson
>Release:        FreeBSD 5.4-STABLE i386
>Organization:
The Allant Group
>Environment:
System: FreeBSD dan.emsphone.com 5.4-STABLE FreeBSD 5.4-STABLE #411: Fri Jun 10 10:55:56 CDT 2005 zsh@dan.emsphone.com:/usr/src/sys/i386/compile/DANSMP i386


	
>Description:

In 2003, a -s flag was added to ministat to separate the
avg/median/stddev bars onto separate lines for readability if the
ranges overlapped.  In 2005, ministat was extended to support more than
2 datasets, but the -s code was not updated.  It will coredump if run
with -s and >2 sets.

	
>How-To-Repeat:
	
>Fix:

Allocate the correct amount of memory to store all the bars in memory.

( newer version may be at
http://dan.allantgroup.com/FreeBSD/ministat.diff )

Index: ministat.c
===================================================================
RCS file: /home/ncvs/src/tools/tools/ministat/ministat.c,v
retrieving revision 1.5
diff -u -p -r1.5 ministat.c
--- ministat.c	27 May 2005 17:52:56 -0000	1.5
+++ ministat.c	30 Jun 2005 15:20:51 -0000
@@ -283,12 +283,13 @@ struct plot {
 	char		*data;
 	char		**bar;
 	int		separate_bars;
+	int		num_datasets;
 };
 
 static struct plot plot;
 
 static void
-SetupPlot(int width, int separate)
+SetupPlot(int width, int separate, int num_datasets)
 {
 	struct plot *pl;
 
@@ -298,6 +299,7 @@ SetupPlot(int width, int separate)
 	pl->data = NULL;
 	pl->bar = NULL;
 	pl->separate_bars = separate;
+	pl->num_datasets = num_datasets;
 	pl->min = 999e99;
 	pl->max = -999e99;
 }
@@ -344,8 +346,8 @@ PlotSet(struct dataset *ds, int val)
 		bar = 0;
 
 	if (pl->bar == NULL) {
-		pl->bar = malloc(sizeof(char *) * 2);
-		memset(pl->bar, 0, sizeof(char*) * 2);
+		pl->bar = malloc(sizeof(char *) * pl->num_datasets);
+		memset(pl->bar, 0, sizeof(char*) * pl->num_datasets);
 	}
 	if (pl->bar[bar] == NULL) {
 		pl->bar[bar] = malloc(pl->width);
@@ -426,7 +428,7 @@ DumpPlot(void)
 		putchar('|');
 		putchar('\n');
 	}
-	for (i = 0; i < 2; i++) {
+	for (i = 0; i < pl->num_datasets; i++) {
 		if (pl->bar[i] == NULL)
 			continue;
 		putchar('|');
@@ -568,7 +570,7 @@ main(int argc, char **argv)
 	}
 
 	if (!flag_n) {
-		SetupPlot(74, flag_s);
+		SetupPlot(74, flag_s, nds);
 		for (i = 0; i < nds; i++)
 			DimPlot(ds[i]);
 		for (i = 0; i < nds; i++)


	


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200507030016.j630GGE5088630>