projects
/
babeltrace.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: Don't assume that PROT_WRITE grants read permissions
[babeltrace.git]
/
formats
/
ctf
/
ctf.c
diff --git
a/formats/ctf/ctf.c
b/formats/ctf/ctf.c
index e31808c3843d27380a63b0d173a949aa027e336e..58b5488920d006e71aafe96b764e5f49ec7c5b6d 100644
(file)
--- a/
formats/ctf/ctf.c
+++ b/
formats/ctf/ctf.c
@@
-763,7
+763,7
@@
int ctf_init_pos(struct ctf_stream_pos *pos, struct bt_trace_descriptor *trace,
pos->parent.trace = trace;
break;
case O_RDWR:
pos->parent.trace = trace;
break;
case O_RDWR:
- pos->prot = PROT_
WRITE; /* Write has priority */
+ pos->prot = PROT_
READ | PROT_WRITE;
pos->flags = MAP_SHARED;
pos->parent.rw_table = write_dispatch_table;
pos->parent.event_cb = ctf_write_event;
pos->flags = MAP_SHARED;
pos->parent.rw_table = write_dispatch_table;
pos->parent.event_cb = ctf_write_event;
@@
-779,7
+779,7
@@
int ctf_init_pos(struct ctf_stream_pos *pos, struct bt_trace_descriptor *trace,
int ctf_fini_pos(struct ctf_stream_pos *pos)
{
int ctf_fini_pos(struct ctf_stream_pos *pos)
{
- if (
pos->prot == PROT_WRITE
&& pos->content_size_loc)
+ if (
(pos->prot & PROT_WRITE)
&& pos->content_size_loc)
*pos->content_size_loc = pos->offset;
if (pos->base_mma) {
int ret;
*pos->content_size_loc = pos->offset;
if (pos->base_mma) {
int ret;
@@
-873,7
+873,7
@@
void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence)
assert(0);
}
assert(0);
}
- if (
pos->prot == PROT_WRITE
&& pos->content_size_loc)
+ if (
(pos->prot & PROT_WRITE)
&& pos->content_size_loc)
*pos->content_size_loc = pos->offset;
if (pos->base_mma) {
*pos->content_size_loc = pos->offset;
if (pos->base_mma) {
@@
-891,7
+891,7
@@
void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence)
* The caller should never ask for ctf_move_pos across packets,
* except to get exactly at the beginning of the next packet.
*/
* The caller should never ask for ctf_move_pos across packets,
* except to get exactly at the beginning of the next packet.
*/
- if (pos->prot
==
PROT_WRITE) {
+ if (pos->prot
&
PROT_WRITE) {
switch (whence) {
case SEEK_CUR:
/* The writer will add padding */
switch (whence) {
case SEEK_CUR:
/* The writer will add padding */
@@
-1001,12
+1001,14
@@
void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence)
}
/* update trace_packet_header and stream_packet_context */
}
/* update trace_packet_header and stream_packet_context */
- if (pos->prot != PROT_WRITE && file_stream->parent.trace_packet_header) {
+ if (!(pos->prot & PROT_WRITE) &&
+ file_stream->parent.trace_packet_header) {
/* Read packet header */
ret = generic_rw(&pos->parent, &file_stream->parent.trace_packet_header->p);
assert(!ret);
}
/* Read packet header */
ret = generic_rw(&pos->parent, &file_stream->parent.trace_packet_header->p);
assert(!ret);
}
- if (pos->prot != PROT_WRITE && file_stream->parent.stream_packet_context) {
+ if (!(pos->prot & PROT_WRITE) &&
+ file_stream->parent.stream_packet_context) {
/* Read packet context */
ret = generic_rw(&pos->parent, &file_stream->parent.stream_packet_context->p);
assert(!ret);
/* Read packet context */
ret = generic_rw(&pos->parent, &file_stream->parent.stream_packet_context->p);
assert(!ret);
@@
-2245,13
+2247,17
@@
void ctf_init_mmap_pos(struct ctf_stream_pos *pos,
static
int prepare_mmap_stream_definition(struct ctf_trace *td,
static
int prepare_mmap_stream_definition(struct ctf_trace *td,
- struct ctf_file_stream *file_stream)
+ struct ctf_file_stream *file_stream,
+ void (*packet_seek)(struct bt_stream_pos *pos, size_t index,
+ int whence))
{
struct ctf_stream_declaration *stream;
{
struct ctf_stream_declaration *stream;
- uint64_t stream_id
= 0
;
+ uint64_t stream_id;
int ret;
int ret;
- file_stream->parent.stream_id = stream_id;
+ /* Ask for the first packet to get the stream_id. */
+ packet_seek(&file_stream->pos.parent, 0, SEEK_SET);
+ stream_id = file_stream->parent.stream_id;
if (stream_id >= td->streams->len) {
fprintf(stderr, "[error] Stream %" PRIu64 " is not declared "
"in metadata.\n", stream_id);
if (stream_id >= td->streams->len) {
fprintf(stderr, "[error] Stream %" PRIu64 " is not declared "
"in metadata.\n", stream_id);
@@
-2281,6
+2287,7
@@
int ctf_open_mmap_stream_read(struct ctf_trace *td,
struct ctf_file_stream *file_stream;
file_stream = g_new0(struct ctf_file_stream, 1);
struct ctf_file_stream *file_stream;
file_stream = g_new0(struct ctf_file_stream, 1);
+ file_stream->parent.stream_id = -1ULL;
file_stream->pos.last_offset = LAST_OFFSET_POISON;
ctf_init_mmap_pos(&file_stream->pos, mmap_info);
file_stream->pos.last_offset = LAST_OFFSET_POISON;
ctf_init_mmap_pos(&file_stream->pos, mmap_info);
@@
-2291,7
+2298,7
@@
int ctf_open_mmap_stream_read(struct ctf_trace *td,
goto error_def;
}
goto error_def;
}
- ret = prepare_mmap_stream_definition(td, file_stream);
+ ret = prepare_mmap_stream_definition(td, file_stream
, packet_seek
);
if (ret)
goto error_index;
if (ret)
goto error_index;
This page took
0.046864 seconds
and
4
git commands to generate.