Fix: consumerd: unbalanced subbuffer 'get' when checking operation availability
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index 4ace64920109dd38e58e75dad6452a78518b47b8..4f734294caa553477f46eb0858edc45b3476b1e9 100644 (file)
@@ -494,7 +494,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
        case LTTNG_CONSUMER_ADD_CHANNEL:
        {
                struct lttng_consumer_channel *new_channel;
-               int ret_send_status, ret_add_channel;
+               int ret_send_status, ret_add_channel = 0;
                const uint64_t chunk_id = msg.u.channel.chunk_id.value;
 
                health_code_update();
@@ -1699,8 +1699,15 @@ int put_next_subbuffer(struct lttng_consumer_stream *stream,
 static
 bool is_get_next_check_metadata_available(int tracer_fd)
 {
-       return kernctl_get_next_subbuf_metadata_check(tracer_fd, NULL) !=
-                       -ENOTTY;
+       const int ret = kernctl_get_next_subbuf_metadata_check(tracer_fd, NULL);
+       const bool available = ret != -ENOTTY;
+
+       if (ret == 0) {
+               /* get succeeded, make sure to put the subbuffer. */
+               kernctl_put_subbuf(tracer_fd);
+       }
+
+       return available;
 }
 
 static
This page took 0.023642 seconds and 4 git commands to generate.