Fix: use off_t type for lseek function return value to avoid overflow
authorGregory LEOCADIE <g.leocadie@criteo.com>
Thu, 29 Mar 2018 10:52:30 +0000 (12:52 +0200)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 9 Apr 2018 16:24:20 +0000 (12:24 -0400)
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 <g.leocadie@criteo.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-relayd/live.c
src/bin/lttng-relayd/main.c
src/bin/lttng-sessiond/cmd.c
src/common/utils.c

index 8a8550f40f60a9a888cf36c8f62d6509f8d3580b..a5016ac33da707eba9b2939ce6c1c2d10d887f04 100644 (file)
@@ -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;
index e3c070f8ba0330c2c297983456b385be19ad0513..a8164ff2246fd3d1a409f9b7e4aaf891e805a82d 100644 (file)
@@ -1588,6 +1588,7 @@ static
 int rotate_truncate_stream(struct relay_stream *stream)
 {
        int ret, new_fd;
+       off_t lseek_ret;
        uint64_t diff, pos = 0;
        char buf[FILE_COPY_BUFFER_SIZE];
 
@@ -1614,10 +1615,11 @@ int rotate_truncate_stream(struct relay_stream *stream)
         * Rewind the current tracefile to the position at which the rotation
         * should have occured.
         */
-       ret = lseek(stream->stream_fd->fd,
+       lseek_ret = lseek(stream->stream_fd->fd,
                        stream->pos_after_last_complete_data_index, SEEK_SET);
-       if (ret < 0) {
+       if (lseek_ret < 0) {
                PERROR("seek truncate stream");
+               ret = -1;
                goto end;
        }
 
index 534f191a8b447d0763d56ec62d4aba42a0c3af70..ad635a9a96b631880171e012aeb462311424bade 100644 (file)
@@ -3671,10 +3671,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;
        }
 
index 004cd8f0d1dcee02aa4b22a4e7f5c6f84a4618f7..7d018b53b1b9430cfb427761f9d4b4a4573e0334 100644 (file)
@@ -1487,15 +1487,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:
This page took 0.034137 seconds and 4 git commands to generate.