The open call take place inside ust, it must be tracked to prevent external
closing.
The bug can be hit during tracing of an application for which the probe
provider is loaded using LD_PRELOAD in combination with the fd utility
shared object. The application is responsible for closing all possible fd.
Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include "lttng-tracer-core.h"
#define BUF_LEN 4096
#include "lttng-tracer-core.h"
#define BUF_LEN 4096
elf->path = strdup(path);
if (!elf->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) {
elf->fd = open(elf->path, O_RDONLY | O_CLOEXEC);
if (elf->fd < 0) {
+ lttng_ust_unlock_fd_tracker();
+ 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;
if (lttng_ust_read(elf->fd, e_ident, EI_NIDENT) < EI_NIDENT) {
goto 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);
*/
void lttng_ust_elf_destroy(struct lttng_ust_elf *elf)
{
*/
void lttng_ust_elf_destroy(struct lttng_ust_elf *elf)
{
- 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->path);
free(elf);
}
free(elf->path);
free(elf);
}