perf tools: Use scnprintf where applicable

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>
This commit is contained in:
Arnaldo Carvalho de Melo 2012-03-14 12:29:29 -03:00
parent b832796caa
commit e7f01d1e3d
8 changed files with 35 additions and 33 deletions

View file

@ -25,7 +25,7 @@ get_cpuid(char *buffer, size_t sz)
pvr = mfspr(SPRN_PVR); 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 */ /* look for end marker to ensure the entire data fit */
if (strchr(buffer, '$')) { if (strchr(buffer, '$')) {

View file

@ -48,7 +48,7 @@ get_cpuid(char *buffer, size_t sz)
if (family >= 0x6) if (family >= 0x6)
model += ((a >> 16) & 0xf) << 4; 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 */ /* look for end marker to ensure the entire data fit */
if (strchr(buffer, '$')) { if (strchr(buffer, '$')) {

View file

@ -1,3 +1,4 @@
#include <linux/kernel.h>
#include "cache.h" #include "cache.h"
#include "color.h" #include "color.h"
@ -182,12 +183,12 @@ static int __color_vsnprintf(char *bf, size_t size, const char *color,
} }
if (perf_use_color_default && *color) if (perf_use_color_default && *color)
r += snprintf(bf, size, "%s", color); r += scnprintf(bf, size, "%s", color);
r += vsnprintf(bf + r, size - r, fmt, args); r += vscnprintf(bf + r, size - r, fmt, args);
if (perf_use_color_default && *color) 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) if (trail)
r += snprintf(bf + r, size - r, "%s", trail); r += scnprintf(bf + r, size - r, "%s", trail);
return r; return r;
} }

View file

@ -280,7 +280,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
if (realname == NULL || filename == NULL || linkname == NULL) if (realname == NULL || filename == NULL || linkname == NULL)
goto out_free; goto out_free;
len = snprintf(filename, size, "%s%s%s", len = scnprintf(filename, size, "%s%s%s",
debugdir, is_kallsyms ? "/" : "", realname); debugdir, is_kallsyms ? "/" : "", realname);
if (mkdir_p(filename, 0755)) if (mkdir_p(filename, 0755))
goto out_free; goto out_free;
@ -295,7 +295,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
goto out_free; goto out_free;
} }
len = snprintf(linkname, size, "%s/.build-id/%.2s", len = scnprintf(linkname, size, "%s/.build-id/%.2s",
debugdir, sbuild_id); debugdir, sbuild_id);
if (access(linkname, X_OK) && mkdir_p(linkname, 0755)) if (access(linkname, X_OK) && mkdir_p(linkname, 0755))

View file

@ -768,7 +768,7 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
sep ? "%.2f" : " %6.2f%%", sep ? "%.2f" : " %6.2f%%",
(period * 100.0) / total); (period * 100.0) / total);
else else
ret = snprintf(s, size, sep ? "%.2f" : " %6.2f%%", ret = scnprintf(s, size, sep ? "%.2f" : " %6.2f%%",
(period * 100.0) / total); (period * 100.0) / total);
if (symbol_conf.show_cpu_utilization) { if (symbol_conf.show_cpu_utilization) {
ret += percent_color_snprintf(s + ret, size - ret, ret += percent_color_snprintf(s + ret, size - ret,
@ -791,20 +791,20 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
} }
} }
} else } 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 (symbol_conf.show_nr_samples) {
if (sep) 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 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 (symbol_conf.show_total_period) {
if (sep) if (sep)
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period); ret += scnprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period);
else else
ret += snprintf(s + ret, size - ret, " %12" PRIu64, period); ret += scnprintf(s + ret, size - ret, " %12" PRIu64, period);
} }
if (pair_hists) { if (pair_hists) {
@ -819,25 +819,25 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
diff = new_percent - old_percent; diff = new_percent - old_percent;
if (fabs(diff) >= 0.01) if (fabs(diff) >= 0.01)
snprintf(bf, sizeof(bf), "%+4.2F%%", diff); ret += scnprintf(bf, sizeof(bf), "%+4.2F%%", diff);
else else
snprintf(bf, sizeof(bf), " "); ret += scnprintf(bf, sizeof(bf), " ");
if (sep) if (sep)
ret += snprintf(s + ret, size - ret, "%c%s", *sep, bf); ret += scnprintf(s + ret, size - ret, "%c%s", *sep, bf);
else else
ret += snprintf(s + ret, size - ret, "%11.11s", bf); ret += scnprintf(s + ret, size - ret, "%11.11s", bf);
if (show_displacement) { if (show_displacement) {
if (displacement) if (displacement)
snprintf(bf, sizeof(bf), "%+4ld", displacement); ret += scnprintf(bf, sizeof(bf), "%+4ld", displacement);
else else
snprintf(bf, sizeof(bf), " "); ret += scnprintf(bf, sizeof(bf), " ");
if (sep) if (sep)
ret += snprintf(s + ret, size - ret, "%c%s", *sep, bf); ret += scnprintf(s + ret, size - ret, "%c%s", *sep, bf);
else else
ret += snprintf(s + ret, size - ret, "%6.6s", bf); ret += scnprintf(s + ret, size - ret, "%6.6s", bf);
} }
} }
@ -855,7 +855,7 @@ int hist_entry__snprintf(struct hist_entry *he, char *s, size_t size,
if (se->elide) if (se->elide)
continue; 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, ret += se->se_snprintf(he, s + ret, size - ret,
hists__col_len(hists, se->se_width_idx)); hists__col_len(hists, se->se_width_idx));
} }

View file

@ -1,4 +1,5 @@
#include "cache.h" #include "cache.h"
#include <linux/kernel.h>
int prefixcmp(const char *str, const char *prefix) int prefixcmp(const char *str, const char *prefix)
{ {
@ -89,14 +90,14 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
if (!strbuf_avail(sb)) if (!strbuf_avail(sb))
strbuf_grow(sb, 64); strbuf_grow(sb, 64);
va_start(ap, fmt); 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); va_end(ap);
if (len < 0) if (len < 0)
die("your vsnprintf is broken"); die("your vscnprintf is broken");
if (len > strbuf_avail(sb)) { if (len > strbuf_avail(sb)) {
strbuf_grow(sb, len); strbuf_grow(sb, len);
va_start(ap, fmt); 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); va_end(ap);
if (len > strbuf_avail(sb)) { if (len > strbuf_avail(sb)) {
die("this should not happen, your snprintf is broken"); die("this should not happen, your snprintf is broken");

View file

@ -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]; unsigned long nr_events = self->stats.nr_events[PERF_RECORD_SAMPLE];
nr_events = convert_unit(nr_events, &unit); 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) if (thread)
printed += snprintf(bf + printed, size - printed, printed += scnprintf(bf + printed, size - printed,
", Thread: %s(%d)", ", Thread: %s(%d)",
(thread->comm_set ? thread->comm : ""), (thread->comm_set ? thread->comm : ""),
thread->pid); thread->pid);
if (dso) if (dso)
printed += snprintf(bf + printed, size - printed, printed += scnprintf(bf + printed, size - printed,
", DSO: %s", dso->short_name); ", DSO: %s", dso->short_name);
return printed; return printed;
} }
@ -1095,7 +1095,7 @@ static void perf_evsel_menu__write(struct ui_browser *browser,
HE_COLORSET_NORMAL); HE_COLORSET_NORMAL);
nr_events = convert_unit(nr_events, &unit); 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); unit, unit == ' ' ? "" : " ", ev_name);
slsmg_printf("%s", bf); slsmg_printf("%s", bf);
@ -1105,8 +1105,8 @@ static void perf_evsel_menu__write(struct ui_browser *browser,
if (!current_entry) if (!current_entry)
ui_browser__set_color(browser, HE_COLORSET_TOP); ui_browser__set_color(browser, HE_COLORSET_TOP);
nr_events = convert_unit(nr_events, &unit); nr_events = convert_unit(nr_events, &unit);
snprintf(bf, sizeof(bf), ": %ld%c%schunks LOST!", nr_events, printed += scnprintf(bf, sizeof(bf), ": %ld%c%schunks LOST!",
unit, unit == ' ' ? "" : " "); nr_events, unit, unit == ' ' ? "" : " ");
warn = bf; warn = bf;
} }

View file

@ -64,7 +64,7 @@ int ui_helpline__show_help(const char *format, va_list ap)
static int backlog; static int backlog;
pthread_mutex_lock(&ui__lock); 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); sizeof(ui_helpline__last_msg) - backlog, format, ap);
backlog += ret; backlog += ret;