X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-elf.c;h=a02ba8d9eb38e3eb418f02dd82f53c270694f03c;hb=9fe043d73a3e2112f859ce1fa489021a96efecc9;hp=f2c098297acab8955df876f01f97d2a738dc0a81;hpb=ba8dcc8ca5b8b7bebed4e10b3dd4fcbc783d529d;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-elf.c b/liblttng-ust/lttng-ust-elf.c index f2c09829..a02ba8d9 100644 --- a/liblttng-ust/lttng-ust-elf.c +++ b/liblttng-ust/lttng-ust-elf.c @@ -16,18 +16,20 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#define _GNU_SOURCE #define _LGPL_SOURCE +#include #include -#include #include #include -#include +#include +#include +#include #include -#include +#include #include -#include + #include + #include "lttng-tracer-core.h" #define BUF_LEN 4096 @@ -243,12 +245,15 @@ struct lttng_ust_elf *lttng_ust_elf_create(const char *path) uint8_t e_ident[EI_NIDENT]; struct lttng_ust_elf_shdr *section_names_shdr; struct lttng_ust_elf *elf = NULL; + int ret, fd; elf = zmalloc(sizeof(struct lttng_ust_elf)); if (!elf) { goto error; } + /* Initialize fd field to -1. 0 is a valid fd number */ + elf->fd = -1; elf->path = strdup(path); if (!elf->path) { @@ -256,12 +261,23 @@ struct lttng_ust_elf *lttng_ust_elf_create(const char *path) } lttng_ust_lock_fd_tracker(); - elf->fd = open(elf->path, O_RDONLY | O_CLOEXEC); - if (elf->fd < 0) { + fd = open(elf->path, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + lttng_ust_unlock_fd_tracker(); + goto error; + } + + ret = lttng_ust_add_fd_to_tracker(fd); + if (ret < 0) { + ret = close(fd); + if (ret) { + PERROR("close on elf->fd"); + } + ret = -1; lttng_ust_unlock_fd_tracker(); goto error; } - lttng_ust_add_fd_to_tracker(elf->fd); + elf->fd = ret; lttng_ust_unlock_fd_tracker(); if (lttng_ust_read(elf->fd, e_ident, EI_NIDENT) < EI_NIDENT) { @@ -433,7 +449,7 @@ int lttng_ust_elf_get_build_id_from_segment( size_t read_len; /* Align start of note entry */ - offset += offset_align(offset, ELF_NOTE_ENTRY_ALIGN); + offset += lttng_ust_offset_align(offset, ELF_NOTE_ENTRY_ALIGN); if (offset >= segment_end) { break; } @@ -458,7 +474,7 @@ int lttng_ust_elf_get_build_id_from_segment( offset += sizeof(nhdr) + nhdr.n_namesz; /* Align start of desc entry */ - offset += offset_align(offset, ELF_NOTE_DESC_ALIGN); + offset += lttng_ust_offset_align(offset, ELF_NOTE_DESC_ALIGN); if (nhdr.n_type != NT_GNU_BUILD_ID) { /*