projects
/
babeltrace.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: add stricter checks on packet boundaries
[babeltrace.git]
/
include
/
babeltrace
/
ctf
/
types.h
diff --git
a/include/babeltrace/ctf/types.h
b/include/babeltrace/ctf/types.h
index 84548527eb0400a4d603673dcd49f97876e3aa07..fad578ff267d3f88b2a966b9c60f6aeacb334c21 100644
(file)
--- a/
include/babeltrace/ctf/types.h
+++ b/
include/babeltrace/ctf/types.h
@@
-129,28
+129,41
@@
int ctf_fini_pos(struct ctf_stream_pos *pos);
/*
* move_pos - move position of a relative bit offset
*
/*
* move_pos - move position of a relative bit offset
*
+ * Return 1 if OK, 0 if out-of-bound.
+ *
* TODO: allow larger files by updating base too.
*/
static inline
* TODO: allow larger files by updating base too.
*/
static inline
-
void
ctf_move_pos(struct ctf_stream_pos *pos, uint64_t bit_offset)
+
int
ctf_move_pos(struct ctf_stream_pos *pos, uint64_t bit_offset)
{
{
+ uint64_t max_len;
+
printf_debug("ctf_move_pos test EOF: %" PRId64 "\n", pos->offset);
if (unlikely(pos->offset == EOF))
printf_debug("ctf_move_pos test EOF: %" PRId64 "\n", pos->offset);
if (unlikely(pos->offset == EOF))
- return;
+ return 0;
+ if (pos->flags & PROT_READ)
+ max_len = pos->content_size;
+ else
+ max_len = pos->packet_size;
+ if (unlikely(pos->offset + bit_offset > max_len))
+ return 0;
pos->offset += bit_offset;
printf_debug("ctf_move_pos after increment: %" PRId64 "\n", pos->offset);
pos->offset += bit_offset;
printf_debug("ctf_move_pos after increment: %" PRId64 "\n", pos->offset);
+ return 1;
}
/*
* align_pos - align position on a bit offset (> 0)
*
}
/*
* align_pos - align position on a bit offset (> 0)
*
+ * Return 1 if OK, 0 if out-of-bound.
+ *
* TODO: allow larger files by updating base too.
*/
static inline
* TODO: allow larger files by updating base too.
*/
static inline
-
void
ctf_align_pos(struct ctf_stream_pos *pos, uint64_t bit_offset)
+
int
ctf_align_pos(struct ctf_stream_pos *pos, uint64_t bit_offset)
{
{
- ctf_move_pos(pos, offset_align(pos->offset, bit_offset));
+
return
ctf_move_pos(pos, offset_align(pos->offset, bit_offset));
}
static inline
}
static inline
@@
-191,9
+204,15
@@
void ctf_pos_pad_packet(struct ctf_stream_pos *pos)
static inline
int ctf_pos_access_ok(struct ctf_stream_pos *pos, uint64_t bit_len)
{
static inline
int ctf_pos_access_ok(struct ctf_stream_pos *pos, uint64_t bit_len)
{
+ uint64_t max_len;
+
if (unlikely(pos->offset == EOF))
return 0;
if (unlikely(pos->offset == EOF))
return 0;
- if (unlikely(pos->offset + bit_len > pos->packet_size))
+ if (pos->flags & PROT_READ)
+ max_len = pos->content_size;
+ else
+ max_len = pos->packet_size;
+ if (unlikely(pos->offset + bit_len > max_len))
return 0;
return 1;
}
return 0;
return 1;
}
This page took
0.023609 seconds
and
4
git commands to generate.