X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-elf.c;h=52078d9629f34df177e88857ccd82690a6fb6c4e;hb=c0c0989ab70574e09b2f7e8b48c2da6af664a849;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..52078d96 100644 --- a/liblttng-ust/lttng-ust-elf.c +++ b/liblttng-ust/lttng-ust-elf.c @@ -1,33 +1,23 @@ /* - * Copyright (C) 2015 Antoine Busque + * SPDX-License-Identifier: LGPL-2.1-or-later * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (C) 2015 Antoine Busque */ -#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 +233,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 +249,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 +437,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 +462,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) { /*