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:09:59 +0000 (12:09 -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-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 9d742536852b4880f30d7245f71d32567a94bc5e..081648889cebdc8e645e76c6b176d60a7a8d2faf 100644 (file)
@@ -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;
        }
 
index 182b6eed7c700cd53579a4bac3cf74a0b1d42f8b..b37e6c5abaac6cec005a4a37fbf505f64b6bde2d 100644 (file)
@@ -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:
This page took 0.030206 seconds and 4 git commands to generate.