From: Gregory LEOCADIE Date: Thu, 29 Mar 2018 10:52:30 +0000 (+0200) Subject: Fix: use off_t type for lseek function return value to avoid overflow X-Git-Tag: v2.10.4~18 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=987af24193476d1cb2fbf9ddccfe5980da52f9c4;p=lttng-tools.git Fix: use off_t type for lseek function return value to avoid overflow Context: LTTng is configured in live mode with only one channel, getting traces for a long-running application (days of uptime) The trace file gets bigger (many GBs), so the offset (bigger than int.MaxValue). When getting a packet for such offset, the lseek returns bigger than int.MaxValue. This value is stored in a variable "ret" of type int. We have an overflow which leads to sending an error to the viewer (babeltrace), which stops. [error] get_data_packet: error. [error] get_data_packet failed [error] Unknown return code 0 Signed-off-by: Gregory LEOCADIE Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-relayd/live.c b/src/bin/lttng-relayd/live.c index 8a8550f40..a5016ac33 100644 --- a/src/bin/lttng-relayd/live.c +++ b/src/bin/lttng-relayd/live.c @@ -1483,6 +1483,7 @@ static int viewer_get_packet(struct relay_connection *conn) { int ret; + off_t lseek_ret; char *reply = NULL; struct lttng_viewer_get_packet get_packet_info; struct lttng_viewer_trace_packet reply_header; @@ -1524,9 +1525,9 @@ int viewer_get_packet(struct relay_connection *conn) } pthread_mutex_lock(&vstream->stream->lock); - ret = lseek(vstream->stream_fd->fd, be64toh(get_packet_info.offset), + lseek_ret = lseek(vstream->stream_fd->fd, be64toh(get_packet_info.offset), SEEK_SET); - if (ret < 0) { + if (lseek_ret < 0) { PERROR("lseek fd %d to offset %" PRIu64, vstream->stream_fd->fd, be64toh(get_packet_info.offset)); goto error; diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 9d7425368..081648889 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -3420,10 +3420,12 @@ static int clear_metadata_file(int fd) { int ret; + off_t lseek_ret; - ret = lseek(fd, 0, SEEK_SET); - if (ret < 0) { + lseek_ret = lseek(fd, 0, SEEK_SET); + if (lseek_ret < 0) { PERROR("lseek"); + ret = -1; goto end; } diff --git a/src/common/utils.c b/src/common/utils.c index 182b6eed7..b37e6c5ab 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -1382,15 +1382,17 @@ LTTNG_HIDDEN int utils_truncate_stream_file(int fd, off_t length) { int ret; + off_t lseek_ret; ret = ftruncate(fd, length); if (ret < 0) { PERROR("ftruncate"); goto end; } - ret = lseek(fd, length, SEEK_SET); - if (ret < 0) { + lseek_ret = lseek(fd, length, SEEK_SET); + if (lseek_ret < 0) { PERROR("lseek"); + ret = -1; goto end; } end: