oggdec: Fix end-of-file detection.
authorAndre Noll <maan@systemlinux.org>
Sun, 25 Apr 2010 12:36:15 +0000 (14:36 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 25 Apr 2010 12:36:15 +0000 (14:36 +0200)
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.

error.h
oggdec_filter.c

diff --git a/error.h b/error.h
index f6dec48..3ad88cd 100644 (file)
--- 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 \
index edd33c1..2f1fb78 100644 (file)
@@ -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)