X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-elf.c;h=f2c098297acab8955df876f01f97d2a738dc0a81;hb=1b5b09266e9a3e023d4d7cc160ce9af94837f9d9;hp=5f27920e48fa041f1d971677b56c643993064de9;hpb=8886accb14ae51eb90cc741b0a8c7ae88928b42d;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-elf.c b/liblttng-ust/lttng-ust-elf.c index 5f27920e..f2c09829 100644 --- a/liblttng-ust/lttng-ust-elf.c +++ b/liblttng-ust/lttng-ust-elf.c @@ -17,6 +17,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -25,10 +26,16 @@ #include #include #include +#include +#include #include "lttng-tracer-core.h" #define BUF_LEN 4096 +#ifndef NT_GNU_BUILD_ID +# define NT_GNU_BUILD_ID 3 +#endif + /* * Retrieve the nth (where n is the `index` argument) phdr (program * header) from the given elf instance. @@ -242,15 +249,20 @@ struct lttng_ust_elf *lttng_ust_elf_create(const char *path) goto error; } + elf->path = strdup(path); if (!elf->path) { goto error; } + lttng_ust_lock_fd_tracker(); elf->fd = open(elf->path, O_RDONLY | O_CLOEXEC); if (elf->fd < 0) { + lttng_ust_unlock_fd_tracker(); goto error; } + lttng_ust_add_fd_to_tracker(elf->fd); + lttng_ust_unlock_fd_tracker(); if (lttng_ust_read(elf->fd, e_ident, EI_NIDENT) < EI_NIDENT) { goto error; @@ -303,16 +315,7 @@ struct lttng_ust_elf *lttng_ust_elf_create(const char *path) return elf; error: - if (elf) { - free(elf->ehdr); - if (elf->fd >= 0) { - if (close(elf->fd)) { - abort(); - } - } - free(elf->path); - free(elf); - } + lttng_ust_elf_destroy(elf); return NULL; } @@ -333,14 +336,25 @@ uint8_t lttng_ust_elf_is_pic(struct lttng_ust_elf *elf) */ void lttng_ust_elf_destroy(struct lttng_ust_elf *elf) { + int ret; + if (!elf) { return; } - free(elf->ehdr); - if (close(elf->fd)) { - abort(); + if (elf->fd >= 0) { + lttng_ust_lock_fd_tracker(); + ret = close(elf->fd); + if (!ret) { + lttng_ust_delete_fd_from_tracker(elf->fd); + } else { + PERROR("close"); + abort(); + } + lttng_ust_unlock_fd_tracker(); } + + free(elf->ehdr); free(elf->path); free(elf); }