From: Andre Noll Date: Sun, 25 Apr 2010 12:36:15 +0000 (+0200) Subject: oggdec: Fix end-of-file detection. X-Git-Tag: v0.4.3~35 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=3aca09b886727eeae5c7084331b4f78ed21c261b oggdec: Fix end-of-file detection. 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. --- diff --git a/error.h b/error.h index f6dec480..3ad88cd4 100644 --- a/error.h +++ b/error.h @@ -280,7 +280,6 @@ extern const char **para_errlist[]; 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 \ diff --git a/oggdec_filter.c b/oggdec_filter.c index edd33c1d..2f1fb787 100644 --- a/oggdec_filter.c +++ b/oggdec_filter.c @@ -199,19 +199,15 @@ static void ogg_post_select(__a_unused struct sched *s, struct task *t) 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; + int ret, ns; 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 (!pod->vf) { + if (ret <= 0) + goto out; + btr_merge(btrn, fn->min_iqs); ret = ogg_init(fn); if (ret <= 0) goto out; @@ -224,15 +220,8 @@ static void ogg_post_select(__a_unused struct sched *s, struct task *t) 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)