Skip to content

Commit

Permalink
perf tools: Use scnprintf where applicable
Browse files Browse the repository at this point in the history
Several places were expecting that the value returned was the number of
characters printed, not what would be printed if there was space.

Fix it by using the scnprintf and vscnprintf variants we inherited from
the kernel sources.

Some corner cases where the number of printed characters were not
accounted were fixed too.

Reported-by: Anton Blanchard <anton@samba.org>
Cc: Anton Blanchard <anton@samba.org>
Cc: Eric B Munson <emunson@mgebm.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Yanmin Zhang <yanmin_zhang@linux.intel.com>
Cc: stable@kernel.org
Link: http://lkml.kernel.org/n/tip-kwxo2eh29cxmd8ilixi2005x@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Arnaldo Carvalho de Melo committed Mar 14, 2012
1 parent b832796 commit e7f01d1
Show file tree
Hide file tree
Showing 8 changed files with 35 additions and 33 deletions.
2 changes: 1 addition & 1 deletion tools/perf/arch/powerpc/util/header.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ get_cpuid(char *buffer, size_t sz)

pvr = mfspr(SPRN_PVR);

nb = snprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr));
nb = scnprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr));

/* look for end marker to ensure the entire data fit */
if (strchr(buffer, '$')) {
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/arch/x86/util/header.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ get_cpuid(char *buffer, size_t sz)
if (family >= 0x6)
model += ((a >> 16) & 0xf) << 4;
}
nb = snprintf(buffer, sz, "%s,%u,%u,%u$", vendor, family, model, step);
nb = scnprintf(buffer, sz, "%s,%u,%u,%u$", vendor, family, model, step);

/* look for end marker to ensure the entire data fit */
if (strchr(buffer, '$')) {
Expand Down
9 changes: 5 additions & 4 deletions tools/perf/util/color.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <linux/kernel.h>
#include "cache.h"
#include "color.h"

Expand Down Expand Up @@ -182,12 +183,12 @@ static int __color_vsnprintf(char *bf, size_t size, const char *color,
}

if (perf_use_color_default && *color)
r += snprintf(bf, size, "%s", color);
r += vsnprintf(bf + r, size - r, fmt, args);
r += scnprintf(bf, size, "%s", color);
r += vscnprintf(bf + r, size - r, fmt, args);
if (perf_use_color_default && *color)
r += snprintf(bf + r, size - r, "%s", PERF_COLOR_RESET);
r += scnprintf(bf + r, size - r, "%s", PERF_COLOR_RESET);
if (trail)
r += snprintf(bf + r, size - r, "%s", trail);
r += scnprintf(bf + r, size - r, "%s", trail);
return r;
}

Expand Down
4 changes: 2 additions & 2 deletions tools/perf/util/header.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
if (realname == NULL || filename == NULL || linkname == NULL)
goto out_free;

len = snprintf(filename, size, "%s%s%s",
len = scnprintf(filename, size, "%s%s%s",
debugdir, is_kallsyms ? "/" : "", realname);
if (mkdir_p(filename, 0755))
goto out_free;
Expand All @@ -295,7 +295,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
goto out_free;
}

len = snprintf(linkname, size, "%s/.build-id/%.2s",
len = scnprintf(linkname, size, "%s/.build-id/%.2s",
debugdir, sbuild_id);

if (access(linkname, X_OK) && mkdir_p(linkname, 0755))
Expand Down
30 changes: 15 additions & 15 deletions tools/perf/util/hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,7 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
sep ? "%.2f" : " %6.2f%%",
(period * 100.0) / total);
else
ret = snprintf(s, size, sep ? "%.2f" : " %6.2f%%",
ret = scnprintf(s, size, sep ? "%.2f" : " %6.2f%%",
(period * 100.0) / total);
if (symbol_conf.show_cpu_utilization) {
ret += percent_color_snprintf(s + ret, size - ret,
Expand All @@ -791,20 +791,20 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
}
}
} else
ret = snprintf(s, size, sep ? "%" PRIu64 : "%12" PRIu64 " ", period);
ret = scnprintf(s, size, sep ? "%" PRIu64 : "%12" PRIu64 " ", period);

if (symbol_conf.show_nr_samples) {
if (sep)
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, nr_events);
ret += scnprintf(s + ret, size - ret, "%c%" PRIu64, *sep, nr_events);
else
ret += snprintf(s + ret, size - ret, "%11" PRIu64, nr_events);
ret += scnprintf(s + ret, size - ret, "%11" PRIu64, nr_events);
}

if (symbol_conf.show_total_period) {
if (sep)
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period);
ret += scnprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period);
else
ret += snprintf(s + ret, size - ret, " %12" PRIu64, period);
ret += scnprintf(s + ret, size - ret, " %12" PRIu64, period);
}

if (pair_hists) {
Expand All @@ -819,25 +819,25 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
diff = new_percent - old_percent;

if (fabs(diff) >= 0.01)
snprintf(bf, sizeof(bf), "%+4.2F%%", diff);
ret += scnprintf(bf, sizeof(bf), "%+4.2F%%", diff);
else
snprintf(bf, sizeof(bf), " ");
ret += scnprintf(bf, sizeof(bf), " ");

if (sep)
ret += snprintf(s + ret, size - ret, "%c%s", *sep, bf);
ret += scnprintf(s + ret, size - ret, "%c%s", *sep, bf);
else
ret += snprintf(s + ret, size - ret, "%11.11s", bf);
ret += scnprintf(s + ret, size - ret, "%11.11s", bf);

if (show_displacement) {
if (displacement)
snprintf(bf, sizeof(bf), "%+4ld", displacement);
ret += scnprintf(bf, sizeof(bf), "%+4ld", displacement);
else
snprintf(bf, sizeof(bf), " ");
ret += scnprintf(bf, sizeof(bf), " ");

if (sep)
ret += snprintf(s + ret, size - ret, "%c%s", *sep, bf);
ret += scnprintf(s + ret, size - ret, "%c%s", *sep, bf);
else
ret += snprintf(s + ret, size - ret, "%6.6s", bf);
ret += scnprintf(s + ret, size - ret, "%6.6s", bf);
}
}

Expand All @@ -855,7 +855,7 @@ int hist_entry__snprintf(struct hist_entry *he, char *s, size_t size,
if (se->elide)
continue;

ret += snprintf(s + ret, size - ret, "%s", sep ?: " ");
ret += scnprintf(s + ret, size - ret, "%s", sep ?: " ");
ret += se->se_snprintf(he, s + ret, size - ret,
hists__col_len(hists, se->se_width_idx));
}
Expand Down
7 changes: 4 additions & 3 deletions tools/perf/util/strbuf.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "cache.h"
#include <linux/kernel.h>

int prefixcmp(const char *str, const char *prefix)
{
Expand Down Expand Up @@ -89,14 +90,14 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
if (!strbuf_avail(sb))
strbuf_grow(sb, 64);
va_start(ap, fmt);
len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
va_end(ap);
if (len < 0)
die("your vsnprintf is broken");
die("your vscnprintf is broken");
if (len > strbuf_avail(sb)) {
strbuf_grow(sb, len);
va_start(ap, fmt);
len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
va_end(ap);
if (len > strbuf_avail(sb)) {
die("this should not happen, your snprintf is broken");
Expand Down
12 changes: 6 additions & 6 deletions tools/perf/util/ui/browsers/hists.c
Original file line number Diff line number Diff line change
Expand Up @@ -837,15 +837,15 @@ static int hists__browser_title(struct hists *self, char *bf, size_t size,
unsigned long nr_events = self->stats.nr_events[PERF_RECORD_SAMPLE];

nr_events = convert_unit(nr_events, &unit);
printed = snprintf(bf, size, "Events: %lu%c %s", nr_events, unit, ev_name);
printed = scnprintf(bf, size, "Events: %lu%c %s", nr_events, unit, ev_name);

if (thread)
printed += snprintf(bf + printed, size - printed,
printed += scnprintf(bf + printed, size - printed,
", Thread: %s(%d)",
(thread->comm_set ? thread->comm : ""),
thread->pid);
if (dso)
printed += snprintf(bf + printed, size - printed,
printed += scnprintf(bf + printed, size - printed,
", DSO: %s", dso->short_name);
return printed;
}
Expand Down Expand Up @@ -1095,7 +1095,7 @@ static void perf_evsel_menu__write(struct ui_browser *browser,
HE_COLORSET_NORMAL);

nr_events = convert_unit(nr_events, &unit);
printed = snprintf(bf, sizeof(bf), "%lu%c%s%s", nr_events,
printed = scnprintf(bf, sizeof(bf), "%lu%c%s%s", nr_events,
unit, unit == ' ' ? "" : " ", ev_name);
slsmg_printf("%s", bf);

Expand All @@ -1105,8 +1105,8 @@ static void perf_evsel_menu__write(struct ui_browser *browser,
if (!current_entry)
ui_browser__set_color(browser, HE_COLORSET_TOP);
nr_events = convert_unit(nr_events, &unit);
snprintf(bf, sizeof(bf), ": %ld%c%schunks LOST!", nr_events,
unit, unit == ' ' ? "" : " ");
printed += scnprintf(bf, sizeof(bf), ": %ld%c%schunks LOST!",
nr_events, unit, unit == ' ' ? "" : " ");
warn = bf;
}

Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/ui/helpline.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ int ui_helpline__show_help(const char *format, va_list ap)
static int backlog;

pthread_mutex_lock(&ui__lock);
ret = vsnprintf(ui_helpline__last_msg + backlog,
ret = vscnprintf(ui_helpline__last_msg + backlog,
sizeof(ui_helpline__last_msg) - backlog, format, ap);
backlog += ret;

Expand Down

0 comments on commit e7f01d1

Please sign in to comment.