Add verification so we free the array only if iterator is of type BT_SEEK_RESTORE
Add return statement at the end of case
Set type of bt_iter_pos returned by bt_iter_get_pos
[ Mathieu Desnoyers edit: check the iter_pos->type before the restore
pointer in bt_iter_free_pos. The && operator is a sequence point, so
the first check is done before the second. Since we might not be
using the union for restore if type != BT_SEEK_RESTORE, check the
type first before accessing the (possibly wrong) union field. ]
Signed-off-by: Francis Deslauriers <francis.deslauriers@polymtl.ca>
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
if (!iter_pos)
return;
- if (iter_pos->u.restore) {
+ if (iter_pos->type == BT_SEEK_RESTORE && iter_pos->u.restore) {
if (iter_pos->u.restore->stream_saved_pos) {
g_array_free(
iter_pos->u.restore->stream_saved_pos,
if (ret)
goto error;
}
+ return 0;
case BT_SEEK_TIME:
tc = iter->ctx->tc;
int i, stream_class_id, stream_id;
pos = g_new0(struct bt_iter_pos, 1);
+ pos->type = BT_SEEK_RESTORE;
pos->u.restore = g_new0(struct bt_saved_pos, 1);
pos->u.restore->tc = tc;
pos->u.restore->stream_saved_pos = g_array_new(FALSE, TRUE,