Skip to content

Commit

Permalink
Merge branch 'misc-update'
Browse files Browse the repository at this point in the history
Use uftrace_basename() to keep the input string untouched like in the
GNU version.

A recent change in musl libc introduced an issue with the basename(3)
that where we can find the declaration (string.h vs. libgen.h).  It
also brings a subtle difference in the implementation.  Let's be clear
with our own implementation.

Fixed: #1909
Signed-off-by: Namhyung Kim <namhyung@gmail.com>
  • Loading branch information
namhyung committed Apr 11, 2024
2 parents 6ea5ba2 + e37be98 commit 17df844
Show file tree
Hide file tree
Showing 21 changed files with 47 additions and 46 deletions.
2 changes: 1 addition & 1 deletion arch/aarch64/mcount-dynamic.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ void mcount_arch_find_module(struct mcount_dynamic_info *mdi, struct uftrace_sym
}

out:
pr_dbg("dynamic patch type: %s: %d (%s)\n", basename(mdi->map->libname), mdi->type,
pr_dbg("dynamic patch type: %s: %d (%s)\n", uftrace_basename(mdi->map->libname), mdi->type,
mdi_type_names[mdi->type]);

elf_finish(&elf);
Expand Down
2 changes: 1 addition & 1 deletion arch/i386/mcount-dynamic.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ void mcount_arch_find_module(struct mcount_dynamic_info *mdi, struct uftrace_sym
}

out:
pr_dbg("dynamic patch type: %s: %d (%s)\n", basename(mdi->map->libname), mdi->type,
pr_dbg("dynamic patch type: %s: %d (%s)\n", uftrace_basename(mdi->map->libname), mdi->type,
mdi_type_names[mdi->type]);
}

Expand Down
2 changes: 1 addition & 1 deletion arch/x86_64/mcount-dynamic.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ void mcount_arch_find_module(struct mcount_dynamic_info *mdi, struct uftrace_sym
}

out:
pr_dbg("dynamic patch type: %s: %d (%s)\n", basename(mdi->map->libname), mdi->type,
pr_dbg("dynamic patch type: %s: %d (%s)\n", uftrace_basename(mdi->map->libname), mdi->type,
mdi_type_names[mdi->type]);

elf_finish(&elf);
Expand Down
5 changes: 3 additions & 2 deletions cmds/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -1178,7 +1178,8 @@ static struct uftrace_graph graphviz_graph = {
static void dump_graphviz_header(struct uftrace_dump_ops *ops, struct uftrace_data *handle,
struct uftrace_opts *opts)
{
char *exename = basename(handle->info.exename);
char *exename = (char *)uftrace_basename(handle->info.exename);

graphviz_graph.root.name = exename;
pr_out("# version\":\"uftrace %s\"\n", UFTRACE_VERSION);

Expand Down Expand Up @@ -1310,7 +1311,7 @@ static void dump_mermaid_header(struct uftrace_dump_ops *ops, struct uftrace_dat
struct uftrace_opts *opts)
{
graph_init_callbacks(NULL, NULL, NULL, ops);
mermaid_graph.root.name = basename(handle->info.exename);
mermaid_graph.root.name = (char *)uftrace_basename(handle->info.exename);

pr_out("<html>\n");
pr_out("<body>\n");
Expand Down
2 changes: 1 addition & 1 deletion cmds/graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ static int create_graph(struct uftrace_session *sess, void *func)

pr_dbg("create graph for session %.*s (%s)\n", SESSION_ID_LEN, sess->sid, sess->exename);

graph->func = xstrdup(full_graph ? basename(sess->exename) : func);
graph->func = xstrdup(full_graph ? uftrace_basename(sess->exename) : func);
INIT_LIST_HEAD(&graph->bt_list);

graph_init(&graph->ug, sess);
Expand Down
3 changes: 2 additions & 1 deletion cmds/record.c
Original file line number Diff line number Diff line change
Expand Up @@ -2008,7 +2008,8 @@ static void copy_data_files(struct uftrace_opts *opts, const char *ext)
glob(path, GLOB_NOSORT, NULL, &g);

for (i = 0; i < g.gl_pathc; i++) {
snprintf(path, sizeof(path), "%s/%s", opts->dirname, basename(g.gl_pathv[i]));
snprintf(path, sizeof(path), "%s/%s", opts->dirname,
uftrace_basename(g.gl_pathv[i]));
copy_file(g.gl_pathv[i], path);
}

Expand Down
8 changes: 4 additions & 4 deletions cmds/replay.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ static void print_module(struct field_data *fd)
uint64_t timestamp = task->timestamp;
struct uftrace_session *s;
struct uftrace_mmap *map;
char *modname = "[unknown]";
const char *modname = "[unknown]";

/* for EVENT or LOST record */
if (fstack == NULL) {
Expand All @@ -111,7 +111,7 @@ static void print_module(struct field_data *fd)
if (map == MAP_KERNEL)
modname = "[kernel]";
else if (map)
modname = basename(map->libname);
modname = uftrace_basename(map->libname);
else if (is_sched_event(fstack->addr))
modname = "[event]";
}
Expand Down Expand Up @@ -719,7 +719,7 @@ static int print_graph_rstack(struct uftrace_data *handle, struct uftrace_task_r
enum uftrace_argspec_string_bits str_mode = 0;
char *symname = NULL;
char args[1024];
char *libname = "";
const char *libname = "";
struct uftrace_mmap *map = NULL;
struct uftrace_dbg_loc *loc = NULL;
char *str_loc = NULL;
Expand Down Expand Up @@ -756,7 +756,7 @@ static int print_graph_rstack(struct uftrace_data *handle, struct uftrace_task_r
if (s != NULL) {
map = find_symbol_map(&s->sym_info, symname);
if (map != NULL)
libname = basename(map->libname);
libname = uftrace_basename(map->libname);
}
}

Expand Down
4 changes: 2 additions & 2 deletions cmds/tui.c
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@ static struct tui_graph *tui_graph_init(struct uftrace_opts *opts)
list_for_each_entry(graph, &tui_graph_list, list) {
/* top (root) is an artificial node, fill the info */
top = &graph->ug.root;
top->name = basename(graph->ug.sess->exename);
top->name = (char *)uftrace_basename(graph->ug.sess->exename);
top->nr_calls = 1;

list_for_each_entry(node, &graph->ug.root.head, list) {
Expand Down Expand Up @@ -1871,7 +1871,7 @@ static void win_display_session(struct tui_window *win, void *node)
curr_sess = partial_graph.ug.sess;
get_current_graph(node, &count);
print_buf(" %c %s #%d: %s", s == curr_sess ? 'G' : ' ', "call Graph for session",
count, basename(s->exename));
count, uftrace_basename(s->exename));
break;
}

Expand Down
15 changes: 8 additions & 7 deletions libmcount/dynamic.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ static bool match_pattern_module(char *pathname)
{
struct patt_list *pl;
bool ret = false;
char *libname = basename(pathname);
const char *libname = uftrace_basename(pathname);
char *soname = get_soname(pathname);

list_for_each_entry(pl, &patterns, list) {
Expand Down Expand Up @@ -394,7 +394,7 @@ static int match_pattern_list(struct uftrace_mmap *map, char *soname, char *sym_
{
struct patt_list *pl;
int ret = 0;
char *libname = basename(map->libname);
const char *libname = uftrace_basename(map->libname);

list_for_each_entry(pl, &patterns, list) {
int len = strlen(pl->module);
Expand All @@ -410,7 +410,8 @@ static int match_pattern_list(struct uftrace_mmap *map, char *soname, char *sym_
return ret;
}

static void parse_pattern_list(char *patch_funcs, char *def_mod, enum uftrace_pattern_type ptype)
static void parse_pattern_list(char *patch_funcs, const char *def_mod,
enum uftrace_pattern_type ptype)
{
struct strv funcs = STRV_INIT;
char *name;
Expand Down Expand Up @@ -600,12 +601,12 @@ static int do_dynamic_update(struct uftrace_sym_info *sinfo, char *patch_funcs,
enum uftrace_pattern_type ptype)
{
struct uftrace_mmap *map;
char *def_mod;
const char *def_mod;

if (patch_funcs == NULL)
return 0;

def_mod = basename(sinfo->exec_map->libname);
def_mod = uftrace_basename(sinfo->exec_map->libname);
parse_pattern_list(patch_funcs, def_mod, ptype);

for_each_map(sinfo, map) {
Expand All @@ -621,7 +622,7 @@ static int do_dynamic_update(struct uftrace_sym_info *sinfo, char *patch_funcs,

if (stats.failed + stats.skipped + stats.nomatch == 0) {
pr_dbg("patched all (%d) functions in '%s'\n", stats.total,
basename(sinfo->filename));
uftrace_basename(sinfo->filename));
}

return 0;
Expand Down Expand Up @@ -675,7 +676,7 @@ int mcount_dynamic_update(struct uftrace_sym_info *sinfo, char *patch_funcs,
int success = stats.total - stats.failed - stats.skipped;
int r, q;

pr_dbg("dynamic patch stats for '%s'\n", basename(sinfo->filename));
pr_dbg("dynamic patch stats for '%s'\n", uftrace_basename(sinfo->filename));
pr_dbg(" total: %8d\n", stats.total);
q = calc_percent(success, stats.total, &r);
pr_dbg(" patched: %8d (%2d.%02d%%)\n", success, q, r);
Expand Down
1 change: 0 additions & 1 deletion libmcount/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,6 @@ extern struct uftrace_mmap *new_map(const char *path, uint64_t start, uint64_t e
extern void record_proc_maps(char *dirname, const char *sess_id, struct uftrace_sym_info *sinfo);
extern void mcount_rstack_inject_return(struct mcount_thread_data *mtdp,
unsigned long *frame_pointer, unsigned long addr);
extern const char *uftrace_basename(const char *pathname);

#ifndef DISABLE_MCOUNT_FILTER
extern void save_argument(struct mcount_thread_data *mtdp, struct mcount_ret_stack *rstack,
Expand Down
2 changes: 1 addition & 1 deletion libmcount/mcount.c
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,7 @@ static void mcount_init_file(void)

send_session_msg(&mtd, mcount_session_name());
pr_dbg("new session started: %.*s: %s\n", SESSION_ID_LEN, mcount_session_name(),
basename(mcount_exename));
uftrace_basename(mcount_exename));

sigemptyset(&sa.sa_mask);
sigaction(SIGABRT, &sa, &old_sigact[0]);
Expand Down
4 changes: 2 additions & 2 deletions libmcount/plthook.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ static int find_got(struct uftrace_elf_data *elf, struct uftrace_elf_iter *iter,
pd->base_addr = offset;
pd->plt_addr = plt_addr;

pr_dbg2("\"%s\" is loaded at %#lx\n", basename(pd->mod_name), pd->base_addr);
pr_dbg2("\"%s\" is loaded at %#lx\n", uftrace_basename(pd->mod_name), pd->base_addr);

memset(&pd->dsymtab, 0, sizeof(pd->dsymtab));
/* do not demangle symbol names since it might call dlsym() */
Expand Down Expand Up @@ -582,7 +582,7 @@ static int setup_mod_plthook_data(struct dl_phdr_info *info, size_t sz, void *ar
}

for (k = 0; k < ARRAY_SIZE(skip_libs); k++) {
if (!fnmatch(skip_libs[k], basename(exename), 0))
if (!fnmatch(skip_libs[k], uftrace_basename(exename), 0))
return 0;
}

Expand Down
7 changes: 0 additions & 7 deletions libmcount/wrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,6 @@ struct dlopen_base_data {
uint64_t timestamp;
};

const char *uftrace_basename(const char *pathname)
{
const char *p = strrchr(pathname, '/');

return p ? p + 1 : pathname;
}

static void send_dlopen_msg(struct mcount_thread_data *mtdp, const char *sess_id,
uint64_t timestamp, uint64_t base_addr, const char *libname)
{
Expand Down
2 changes: 1 addition & 1 deletion utils/argspec.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ static int check_so_cb(struct dl_phdr_info *info, size_t size, void *data)
const char *soname = data;
int so_used = 0;

if (!strncmp(basename(info->dlpi_name), soname, strlen(soname)))
if (!strncmp(uftrace_basename(info->dlpi_name), soname, strlen(soname)))
so_used = 1;

return so_used;
Expand Down
2 changes: 1 addition & 1 deletion utils/data-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -838,7 +838,7 @@ TEST_CASE(data_basic)

TEST_EQ(t->tid, 10);
TEST_EQ(t->tid, t->pid);
TEST_STREQ(t->comm, basename(opts.exename));
TEST_STREQ(t->comm, uftrace_basename(opts.exename));

close_data_file(&opts, &handle);

Expand Down
2 changes: 1 addition & 1 deletion utils/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ static bool check_busybox(const char *pager)
check:
path = realpath(pager, NULL);
if (path) {
ret = !strncmp("busybox", basename(path), 7);
ret = !strncmp("busybox", uftrace_basename(path), 7);
free(path);
}

Expand Down
8 changes: 4 additions & 4 deletions utils/dwarf.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ static char *make_enum_name(Dwarf_Die *die)

off = dwarf_cuoffset(die);

xasprintf(&enum_name, "_%s_%lx", basename(cu_name), off);
xasprintf(&enum_name, "_%s_%lx", uftrace_basename(cu_name), off);

/* replace forbidden characters */
tmp = enum_name;
Expand Down Expand Up @@ -1934,7 +1934,7 @@ static FILE *create_debug_file(const char *dirname, const char *filename, char *
FILE *fp;
char *tmp;

xasprintf(&tmp, "%s/%s.dbg", dirname, basename(filename));
xasprintf(&tmp, "%s/%s.dbg", dirname, uftrace_basename(filename));
if (match_debug_file(tmp, filename, build_id)) {
free(tmp);
return NULL;
Expand Down Expand Up @@ -2077,7 +2077,7 @@ static void save_debug_entries(struct uftrace_dbg_info *dinfo, const char *dirna
save_debug_file(fp, 'R', entry->spec, 0);
}

close_debug_file(fp, dirname, basename(filename), build_id);
close_debug_file(fp, dirname, uftrace_basename(filename), build_id);
}

void save_debug_info(struct uftrace_sym_info *sinfo, const char *dirname)
Expand All @@ -2104,7 +2104,7 @@ static int load_debug_file(struct uftrace_dbg_info *dinfo, struct uftrace_symtab
char *func = NULL;
uint64_t offset = 0;

xasprintf(&pathname, "%s/%s.dbg", dirname, basename(filename));
xasprintf(&pathname, "%s/%s.dbg", dirname, uftrace_basename(filename));

if (!match_debug_file(pathname, filename, build_id)) {
char *newfile;
Expand Down
2 changes: 1 addition & 1 deletion utils/script-python.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ static int set_python_path(char *py_pathname)
static int import_python_module(char *py_pathname)
{
PyObject *pName;
char *py_basename = xstrdup(basename(py_pathname));
char *py_basename = xstrdup(uftrace_basename(py_pathname));

remove_py_suffix(py_basename);

Expand Down
4 changes: 2 additions & 2 deletions utils/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ void create_session(struct uftrace_session_link *sessions, struct uftrace_msg_se

t = find_task(sessions, s->tid);
if (t) {
strncpy(t->comm, basename(exename), sizeof(t->comm));
strncpy(t->comm, uftrace_basename(exename), sizeof(t->comm));
t->comm[sizeof(t->comm) - 1] = '\0';
}

Expand Down Expand Up @@ -555,7 +555,7 @@ void create_task(struct uftrace_session_link *sessions, struct uftrace_msg_task

if (s != NULL) {
add_session_ref(t, s, msg->time);
strncpy(t->comm, basename(s->exename), sizeof(t->comm));
strncpy(t->comm, uftrace_basename(s->exename), sizeof(t->comm));
t->comm[sizeof(t->comm) - 1] = '\0';
}

Expand Down
6 changes: 3 additions & 3 deletions utils/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1080,7 +1080,7 @@ static void load_module_symbol(struct uftrace_sym_info *sinfo, struct uftrace_mo
char buf[PATH_MAX];
char build_id[BUILD_ID_STR_SIZE];

xasprintf(&symfile, "%s/%s.sym", sinfo->symdir, basename(m->name));
xasprintf(&symfile, "%s/%s.sym", sinfo->symdir, uftrace_basename(m->name));
if (access(symfile, F_OK) == 0) {
if (check_symbol_file(symfile, buf, sizeof(buf), build_id,
sizeof(build_id)) > 0 &&
Expand Down Expand Up @@ -1188,7 +1188,7 @@ void load_module_symtabs(struct uftrace_sym_info *sinfo)
}

for_each_map(sinfo, map) {
const char *libname = basename(map->libname);
const char *libname = uftrace_basename(map->libname);
bool skip = false;

for (k = 0; k < ARRAY_SIZE(skip_libs); k++) {
Expand Down Expand Up @@ -1352,7 +1352,7 @@ void save_module_symtabs(const char *dirname)
while (n != NULL) {
mod = rb_entry(n, typeof(*mod), node);

xasprintf(&symfile, "%s/%s.sym", dirname, basename(mod->name));
xasprintf(&symfile, "%s/%s.sym", dirname, uftrace_basename(mod->name));

read_build_id(mod->name, build_id, sizeof(build_id));
save_module_symbol_file(&mod->symtab, mod->name, build_id, symfile, 0);
Expand Down
10 changes: 8 additions & 2 deletions utils/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -403,10 +403,16 @@ char *str_rtrim(char *str);
char **parse_cmdline(char *cmd, int *argc);
void free_parsed_cmdline(char **argv);

struct uftrace_data;

char *absolute_dirname(const char *path, char *resolved_path);

/* Do not modify the input path (unlike in POSIX version) */
static inline const char *uftrace_basename(const char *pathname)
{
const char *p = strrchr(pathname, '/');

return p ? p + 1 : pathname;
}

char *uftrace_strerror(int errnum, char *buf, size_t buflen);

void stacktrace(void);
Expand Down

0 comments on commit 17df844

Please sign in to comment.