aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Price <anprice@redhat.com>2014-04-27 06:16:01 +0100
committerChris Mason <clm@fb.com>2014-09-24 12:02:09 -0700
commit177d648bdd959ad4de02ca07aece5e6053682816 (patch)
treefac43ae29792cb4f35fd3089babff6709d6a7a11
parent5d9d4f4c13fc6db392ffb77f4f2ccca0454275de (diff)
downloadblktrace-177d648bdd959ad4de02ca07aece5e6053682816.tar.gz
iowatcher: Fix up some strcpy and strcat usage
Fix an unchecked strcpy and strcat in plot_io_movie(): $ ./iowatcher -t foo --movie -o foo.ogv -l $(printf 'x%.0s' {1..300}) [...] *** buffer overflow detected ***: ./iowatcher terminated There was also very similar code in plot_io() so a new function plot_io_legend() was added to factor out the common string building code and replace the buggy code with asprintf(). Also add a closedir() call to an error path in traces_list() to plug a resource leak and make iowatcher Coverity-clean (ignoring some false-positives). Signed-off-by: Andrew Price <anprice@redhat.com>
-rw-r--r--iowatcher/blkparse.c4
-rw-r--r--iowatcher/main.c64
2 files changed, 27 insertions, 41 deletions
diff --git a/iowatcher/blkparse.c b/iowatcher/blkparse.c
index a3d9f8a..83e707a 100644
--- a/iowatcher/blkparse.c
+++ b/iowatcher/blkparse.c
@@ -751,8 +751,10 @@ static struct tracelist *traces_list(char *dir_name, int *len)
n += dlen + 1; /* dir + '/' + file */
/* Allocate space for tracelist + filename */
tl = calloc(1, sizeof(struct tracelist) + (sizeof(char) * (n + 1)));
- if (!tl)
+ if (!tl) {
+ closedir(dir);
return NULL;
+ }
tl->next = traces;
tl->name = (char *)(tl + 1);
snprintf(tl->name, n, "%s/%s", dir_name, d->d_name);
diff --git a/iowatcher/main.c b/iowatcher/main.c
index 2b9667c..cbf6c9a 100644
--- a/iowatcher/main.c
+++ b/iowatcher/main.c
@@ -713,6 +713,22 @@ static int count_io_plot_types(void)
return total_io_types;
}
+static void plot_io_legend(struct plot *plot, struct graph_dot_data *gdd, char *prefix, char *rw)
+{
+ int ret = 0;
+ char *label = NULL;
+ if (io_per_process)
+ ret = asprintf(&label, "%s %s", prefix, gdd->label);
+ else
+ ret = asprintf(&label, "%s", prefix);
+ if (ret < 0) {
+ perror("Failed to process labels");
+ exit(1);
+ }
+ svg_add_legend(plot, label, rw, gdd->color);
+ free(label);
+}
+
static void plot_io(struct plot *plot, unsigned int min_seconds,
unsigned int max_seconds, u64 min_offset, u64 max_offset)
{
@@ -733,33 +749,17 @@ static void plot_io(struct plot *plot, unsigned int min_seconds,
set_xticks(plot, num_xticks, min_seconds, max_seconds);
list_for_each_entry(tf, &all_traces, list) {
- char label[256];
- char *pos;
-
- if (!tf->label)
- label[0] = 0;
- else {
- strncpy(label, tf->label, 255);
- label[255] = 0;
- if (io_per_process)
- strcat(label, " ");
- }
- pos = label + strlen(label);
+ char *prefix = tf->label ? tf->label : "";
for (i = 0; i < tf->io_plots; i++) {
if (tf->gdd_writes[i]) {
svg_io_graph(plot, tf->gdd_writes[i]);
- if (io_per_process)
- strcpy(pos, tf->gdd_writes[i]->label);
- svg_add_legend(plot, label, " Writes", tf->gdd_writes[i]->color);
+ plot_io_legend(plot, tf->gdd_writes[i], prefix, " Writes");
}
if (tf->gdd_reads[i]) {
svg_io_graph(plot, tf->gdd_reads[i]);
- if (io_per_process)
- strcpy(pos, tf->gdd_reads[i]->label);
- svg_add_legend(plot, label, " Reads", tf->gdd_reads[i]->color);
+ plot_io_legend(plot, tf->gdd_reads[i], prefix, " Reads");
}
-
}
}
if (plot->add_xlabel)
@@ -1093,17 +1093,7 @@ static void plot_io_movie(struct plot *plot)
batch_count = 1;
list_for_each_entry(tf, &all_traces, list) {
- char label[256];
- char *pos;
-
- if (!tf->label)
- label[0] = 0;
- else {
- strcpy(label, tf->label);
- if (io_per_process)
- strcat(label, " ");
- }
- pos = label + strlen(label);
+ char *prefix = tf->label ? tf->label : "";
i = 0;
while (i < cols) {
@@ -1143,16 +1133,10 @@ static void plot_io_movie(struct plot *plot)
history->col = i;
for (pid = 0; pid < tf->io_plots; pid++) {
- if (tf->gdd_reads[pid]) {
- if (io_per_process)
- strcpy(pos, tf->gdd_reads[pid]->label);
- svg_add_legend(plot, label, " Reads", tf->gdd_reads[pid]->color);
- }
- if (tf->gdd_writes[pid]) {
- if (io_per_process)
- strcpy(pos, tf->gdd_writes[pid]->label);
- svg_add_legend(plot, label, " Writes", tf->gdd_writes[pid]->color);
- }
+ if (tf->gdd_reads[pid])
+ plot_io_legend(plot, tf->gdd_reads[pid], prefix, " Reads");
+ if (tf->gdd_writes[pid])
+ plot_io_legend(plot, tf->gdd_writes[pid], prefix, " Writes");
}
batch_i = 0;