projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: consumer snapshot: handle unsigned long overflow
[lttng-tools.git]
/
src
/
common
/
kernel-consumer
/
kernel-consumer.c
diff --git
a/src/common/kernel-consumer/kernel-consumer.c
b/src/common/kernel-consumer/kernel-consumer.c
index a5dcc663d68c67f4b465ecabe70004f682842f3f..d44ee6a7d67fd79bd613ed6502db5145ce46e35a 100644
(file)
--- a/
src/common/kernel-consumer/kernel-consumer.c
+++ b/
src/common/kernel-consumer/kernel-consumer.c
@@
-60,7
+60,11
@@
int lttng_kconsumer_take_snapshot(struct lttng_consumer_stream *stream)
int infd = stream->wait_fd;
ret = kernctl_snapshot(infd);
int infd = stream->wait_fd;
ret = kernctl_snapshot(infd);
- if (ret != 0) {
+ /*
+ * -EAGAIN is not an error, it just means that there is no data to
+ * be read.
+ */
+ if (ret != 0 && ret != -EAGAIN) {
PERROR("Getting sub-buffer snapshot.");
}
PERROR("Getting sub-buffer snapshot.");
}
@@
-187,14
+191,6
@@
int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
DBG("Kernel consumer snapshot stream %s/%s (%" PRIu64 ")",
path, stream->name, stream->key);
}
DBG("Kernel consumer snapshot stream %s/%s (%" PRIu64 ")",
path, stream->name, stream->key);
}
- if (relayd_id != -1ULL) {
- ret = consumer_send_relayd_streams_sent(relayd_id);
- if (ret < 0) {
- ERR("sending streams sent to relayd");
- goto end_unlock;
- }
- channel->streams_sent_to_relayd = true;
- }
ret = kernctl_buffer_flush_empty(stream->wait_fd);
if (ret < 0) {
ret = kernctl_buffer_flush_empty(stream->wait_fd);
if (ret < 0) {
@@
-244,7
+240,7
@@
int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
produced_pos, nb_packets_per_stream,
stream->max_sb_size);
produced_pos, nb_packets_per_stream,
stream->max_sb_size);
- while (
consumed_pos < produced_pos
) {
+ while (
(long) (consumed_pos - produced_pos) < 0
) {
ssize_t read_len;
unsigned long len, padded_len;
ssize_t read_len;
unsigned long len, padded_len;
@@
-340,7
+336,7
@@
end:
*
* Returns 0 on success, < 0 on error
*/
*
* Returns 0 on success, < 0 on error
*/
-int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
+
static
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
uint64_t relayd_id, struct lttng_consumer_local_data *ctx)
{
int ret, use_relayd = 0;
uint64_t relayd_id, struct lttng_consumer_local_data *ctx)
{
int ret, use_relayd = 0;
@@
-359,11
+355,12
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
if (!metadata_channel) {
ERR("Kernel snapshot metadata not found for key %" PRIu64, key);
ret = -1;
if (!metadata_channel) {
ERR("Kernel snapshot metadata not found for key %" PRIu64, key);
ret = -1;
- goto error;
+ goto error
_no_channel
;
}
metadata_stream = metadata_channel->metadata_stream;
assert(metadata_stream);
}
metadata_stream = metadata_channel->metadata_stream;
assert(metadata_stream);
+ pthread_mutex_lock(&metadata_stream->lock);
/* Flag once that we have a valid relayd for the stream. */
if (relayd_id != (uint64_t) -1ULL) {
/* Flag once that we have a valid relayd for the stream. */
if (relayd_id != (uint64_t) -1ULL) {
@@
-373,7
+370,7
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
if (use_relayd) {
ret = consumer_send_relayd_stream(metadata_stream, path);
if (ret < 0) {
if (use_relayd) {
ret = consumer_send_relayd_stream(metadata_stream, path);
if (ret < 0) {
- goto error;
+ goto error
_snapshot
;
}
} else {
ret = utils_create_stream_file(path, metadata_stream->name,
}
} else {
ret = utils_create_stream_file(path, metadata_stream->name,
@@
-381,7
+378,7
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
metadata_stream->tracefile_count_current,
metadata_stream->uid, metadata_stream->gid, NULL);
if (ret < 0) {
metadata_stream->tracefile_count_current,
metadata_stream->uid, metadata_stream->gid, NULL);
if (ret < 0) {
- goto error;
+ goto error
_snapshot
;
}
metadata_stream->out_fd = ret;
}
}
metadata_stream->out_fd = ret;
}
@@
-394,7
+391,8
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
if (ret_read != -EAGAIN) {
ERR("Kernel snapshot reading metadata subbuffer (ret: %zd)",
ret_read);
if (ret_read != -EAGAIN) {
ERR("Kernel snapshot reading metadata subbuffer (ret: %zd)",
ret_read);
- goto error;
+ ret = ret_read;
+ goto error_snapshot;
}
/* ret_read is negative at this point so we will exit the loop. */
continue;
}
/* ret_read is negative at this point so we will exit the loop. */
continue;
@@
-419,11
+417,12
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
}
ret = 0;
}
ret = 0;
-
+error_snapshot:
+ pthread_mutex_unlock(&metadata_stream->lock);
cds_list_del(&metadata_stream->send_node);
consumer_stream_destroy(metadata_stream, NULL);
metadata_channel->metadata_stream = NULL;
cds_list_del(&metadata_stream->send_node);
consumer_stream_destroy(metadata_stream, NULL);
metadata_channel->metadata_stream = NULL;
-error:
+error
_no_channel
:
rcu_read_unlock();
return ret;
}
rcu_read_unlock();
return ret;
}
This page took
0.025351 seconds
and
4
git commands to generate.