vss: Avoid read-overflowing the header buffer for ogg streams.
[paraslash.git] / ogg_afh.c
index 2837db61c7de43a732564c8d46fec14ef6b4331e..08023458216cff6065c9d02e248c505da6524773 100644 (file)
--- a/ogg_afh.c
+++ b/ogg_afh.c
@@ -105,7 +105,6 @@ static int vorbis_get_header_callback(ogg_packet *packet, int packet_num,
                return 0;
        if (packet_num == 0) {
                ogg_stream_init(&vghd->os, serial);
-               ret = -E_OGG_PACKET_IN;
                ret = ogg_stream_packetin(&vghd->os, packet);
                if (ret < 0)
                        goto out;
@@ -116,8 +115,8 @@ static int vorbis_get_header_callback(ogg_packet *packet, int packet_num,
                return 1;
        }
        if (packet_num == 1) {
-               PARA_INFO_LOG("replacing metadata packet\n");
                ogg_packet replacement = *packet;
+               PARA_INFO_LOG("replacing metadata packet\n");
                replacement.packet = dummy_packet;
                replacement.bytes = sizeof(dummy_packet);
                ret = ogg_stream_packetin(&vghd->os, &replacement);
@@ -129,10 +128,8 @@ static int vorbis_get_header_callback(ogg_packet *packet, int packet_num,
        ret = -E_OGG_PACKET_IN;
        if (ogg_stream_packetin(&vghd->os, packet) < 0)
                goto out;
-       ret = -E_OGG_STREAM_FLUSH;
-       if (ogg_stream_flush(&vghd->os, &og) == 0)
-               goto out;
-       add_ogg_page(&og, vghd);
+       while (ogg_stream_flush(&vghd->os, &og))
+               add_ogg_page(&og, vghd);
        ret = 0;
 out:
        ogg_stream_clear(&vghd->os);