X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcommon%2Fcompat%2Fcompat-epoll.c;h=ecd09a0924a43f3aef6dbcd0fdb2055a45d44bb9;hb=53efb85a242809ed5ed21e9ab40effa696ecbc6f;hp=40451b3d21286106430c1322209b21d9fef9579f;hpb=d21b0d71990ac6ec4272c1f80f0ca544103628b3;p=lttng-tools.git diff --git a/src/common/compat/compat-epoll.c b/src/common/compat/compat-epoll.c index 40451b3d2..ecd09a092 100644 --- a/src/common/compat/compat-epoll.c +++ b/src/common/compat/compat-epoll.c @@ -27,6 +27,8 @@ #include #include +#include +#include #include "poll.h" @@ -49,6 +51,11 @@ static int resize_poll_event(struct lttng_poll_event *events, PERROR("realloc epoll add"); goto error; } + if (new_size > events->alloc_size) { + /* Zero newly allocated memory */ + memset(ptr + events->alloc_size, 0, + (new_size - events->alloc_size) * sizeof(*ptr)); + } events->events = ptr; events->alloc_size = new_size; @@ -117,6 +124,11 @@ int compat_epoll_add(struct lttng_poll_event *events, int fd, uint32_t req_event goto error; } + /* + * Zero struct epoll_event to ensure all representations of its + * union are zeroed. + */ + memset(&ev, 0, sizeof(ev)); ev.events = req_events; ev.data.fd = fd; @@ -169,8 +181,6 @@ int compat_epoll_del(struct lttng_poll_event *events, int fd) PERROR("epoll_ctl DEL fatal"); goto error; } - PERROR("epoll_ctl del"); - goto error; } events->nb_fd--; @@ -203,11 +213,15 @@ int compat_epoll_wait(struct lttng_poll_event *events, int timeout) */ if (events->nb_fd > events->alloc_size) { /* Expand if the nb_fd is higher than the actual size. */ - new_size = events->alloc_size << 1UL; + new_size = max_t(uint32_t, + 1U << utils_get_count_order_u32(events->nb_fd), + events->alloc_size << 1UL); } else if ((events->nb_fd << 1UL) <= events->alloc_size && events->nb_fd >= events->init_size) { /* Shrink if nb_fd multiplied by two is <= than the actual size. */ - new_size = events->alloc_size >> 1UL; + new_size = max_t(uint32_t, + utils_get_count_order_u32(events->nb_fd) >> 1U, + events->alloc_size >> 1U); } else { /* Indicate that we don't want to resize. */ new_size = 0; @@ -246,6 +260,7 @@ error: void compat_epoll_set_max_size(void) { int ret, fd; + ssize_t size_ret; char buf[64]; poll_max_size = DEFAULT_POLL_SIZE; @@ -255,11 +270,16 @@ void compat_epoll_set_max_size(void) return; } - ret = read(fd, buf, sizeof(buf)); - if (ret < 0) { + size_ret = lttng_read(fd, buf, sizeof(buf)); + /* + * Allow reading a file smaller than buf, but keep space for + * final \0. + */ + if (size_ret < 0 || size_ret >= sizeof(buf)) { PERROR("read set max size"); goto error; } + buf[size_ret] = '\0'; poll_max_size = atoi(buf); if (poll_max_size == 0) {