Context https://bugzilla.libav.org/show_bug.cgi?id=420

We have different problems with that sample:

- the mov demuxer ends up sending a huge packet because of a misparsing

- the packet size * 8 overflows the integer and init_get_bits doesn't
return errors.

- show_bits just segfaults on nulled context

So far I have this naive solution:

-static inline void init_get_bits(GetBitContext *s, const uint8_t *buffer,
+static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
                                  int bit_size)
 {
     int buffer_size = (bit_size+7)>>3;
+    int ret = 0;
     if (buffer_size < 0 || bit_size < 0) {
         buffer_size = bit_size = 0;
         buffer = NULL;
+        ret = AVERROR_INVALIDDATA;
     }

     s->buffer       = buffer;
@@ -383,6 +385,7 @@ static inline void init_get_bits(GetBitContext *s,
const uint8_t *buffer,
 #endif
     s->buffer_end   = buffer + buffer_size;
     s->index        = 0;
+    return ret;
 }

And it works decently w/out having an incredible impact on performance,
still show_bits can crash.

I hadn't checked if we can do something on the mov demuxer yet.

lu
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to