diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 582b5d344aa3..436922f1f9d9 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -413,7 +413,28 @@ void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) static void dso__set_basename(struct dso *dso) { - dso__set_short_name(dso, basename((char *)dso->long_name), false); + /* + * basename() may modify path buffer, so we must pass + * a copy. + */ + char *base, *lname = strdup(dso->long_name); + + if (!lname) + return; + + /* + * basename() may return a pointer to internal + * storage which is reused in subsequent calls + * so copy the result. + */ + base = strdup(basename(lname)); + + free(lname); + + if (!base) + return; + + dso__set_short_name(dso, base, true); } int dso__name_len(const struct dso *dso)