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-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=b61e1dca934c1cda7632d154c243dcf56aabac60 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 96d0a180a..70da4a9a7 100644 --- a/src/bin/lttng-relayd/live.c +++ b/src/bin/lttng-relayd/live.c @@ -1480,6 +1480,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; @@ -1521,9 +1522,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 23c6c31a2..bb46093e2 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -3407,10 +3407,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 aa11551c3..24c3b8ca1 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -1335,15 +1335,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: