]> git.tue.mpg.de Git - paraslash.git/commitdiff
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 f6dec480c81fe5af5dfaf9ca28d57884ca1ab135..3ad88cd4fab44cf7a2527bdcbf905b7d2eaf82da 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 edd33c1db88e6add8f84677fce75bc0ff825334a..2f1fb787814742ed4d503612b0728d5d8158aaa4 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)