Fix: overflow of signed integer results in undefined behaviour
[babeltrace.git] / formats / ctf / writer / event-fields.c
index 461888f9b09498e0ea558d9b39b2ccd3aa46ce7f..1ffbd4a350b53741b00523f4f392fbc2934872c7 100644 (file)
@@ -30,6 +30,7 @@
 #include <babeltrace/ctf-writer/event-fields-internal.h>
 #include <babeltrace/ctf-writer/event-types-internal.h>
 #include <babeltrace/compiler.h>
+#include <babeltrace/compat/fcntl.h>
 
 #define PACKET_LEN_INCREMENT   (getpagesize() * 8 * CHAR_BIT)
 
@@ -523,8 +524,8 @@ int bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *field,
        }
 
        size = integer_type->declaration.len;
-       min_value = -((int64_t)1 << (size - 1));
-       max_value = ((int64_t)1 << (size - 1)) - 1;
+       min_value = -(1ULL << (size - 1));
+       max_value = (1ULL << (size - 1)) - 1;
        if (value < min_value || value > max_value) {
                ret = -1;
                goto end;
@@ -1241,9 +1242,13 @@ int increase_packet_size(struct ctf_stream_pos *pos)
        }
 
        pos->packet_size += PACKET_LEN_INCREMENT;
-       ret = posix_fallocate(pos->fd, pos->mmap_offset,
-               pos->packet_size / CHAR_BIT);
+       do {
+               ret = bt_posix_fallocate(pos->fd, pos->mmap_offset,
+                       pos->packet_size / CHAR_BIT);
+       } while (ret == EINTR);
        if (ret) {
+               errno = EINTR;
+               ret = -1;
                goto end;
        }
 
This page took 0.025263 seconds and 4 git commands to generate.