This bug causes the end of the decoded output not being written to the child nodes
of the buffer tree under certain circumstances. Even if the buffer tree detects EOF
we must not just bail out because there might still be data available for ov_read().
So remember the node status and return negative only if the node status is negative
_and_ ov_read() returns zero.
PARA_ERROR(OGGDEC_FAULT, "bug or heap/stack corruption"), \
PARA_ERROR(OGGDEC_BADLINK, "invalid stream section or requested link corrupt"), \
PARA_ERROR(OGGDEC_SYNTAX, "syntax error in oggdec config"), \
PARA_ERROR(OGGDEC_FAULT, "bug or heap/stack corruption"), \
PARA_ERROR(OGGDEC_BADLINK, "invalid stream section or requested link corrupt"), \
PARA_ERROR(OGGDEC_SYNTAX, "syntax error in oggdec config"), \
- PARA_ERROR(OGGDEC_EOF, "oggdec: end of file"), \
#define GRAB_CLIENT_ERRORS \
#define GRAB_CLIENT_ERRORS \
struct filter_node *fn = container_of(t, struct filter_node, task);
struct private_oggdec_data *pod = fn->private_data;
struct btr_node *btrn = fn->btrn;
struct filter_node *fn = container_of(t, struct filter_node, task);
struct private_oggdec_data *pod = fn->private_data;
struct btr_node *btrn = fn->btrn;
- size_t iqs, len;
- int ret;
- char *in;
pod->converted = 0;
t->error = 0;
pod->converted = 0;
t->error = 0;
- ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL);
- if (ret <= 0)
- goto out;
- btr_merge(btrn, fn->min_iqs);
- len = btr_next_buffer(btrn, &in);
- iqs = btr_get_input_queue_size(btrn);
+ ret = ns = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL);
+ if (ret <= 0)
+ goto out;
+ btr_merge(btrn, fn->min_iqs);
ret = ogg_init(fn);
if (ret <= 0)
goto out;
ret = ogg_init(fn);
if (ret <= 0)
goto out;
pod->converted = 0;
if (read_ret <= 0)
free(out);
pod->converted = 0;
if (read_ret <= 0)
free(out);
- if (read_ret == 0) {
- if (btr_no_parent(btrn))
- ret = -E_OGGDEC_EOF;
- else
- ret = 0;
- goto out;
- }
- ret = 0;
- if (read_ret == OV_HOLE)
+ ret = ns;
+ if (read_ret == 0 || read_ret == OV_HOLE)
goto out;
ret = -E_OGGDEC_BADLINK;
if (read_ret < 0)
goto out;
ret = -E_OGGDEC_BADLINK;
if (read_ret < 0)