[FFmpeg-cvslog] r12241 - trunk/libavformat/mov.c

Baptiste Coudurier baptiste.coudurier
Wed Feb 27 10:32:16 CET 2008


Hi,

Michael Niedermayer wrote:
> On Tue, Feb 26, 2008 at 07:21:58PM +0100, bcoudurier wrote:
>> Author: bcoudurier
>> Date: Tue Feb 26 19:21:58 2008
>> New Revision: 12241
>>
>> Log:
>> support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
> [...]
>> +static int mov_read_dref(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
>> +{
>> +    AVStream *st = c->fc->streams[c->fc->nb_streams-1];
>> +    MOVStreamContext *sc = st->priv_data;
>> +    int entries, i, j;
>> +
>> +    get_be32(pb); // version + flags
>> +    entries = get_be32(pb);
>> +    if (entries >= UINT_MAX / sizeof(*sc->drefs))
>> +        return -1;
>> +    sc->drefs_count = entries;
>> +    sc->drefs = av_mallocz(entries * sizeof(*sc->drefs));
>> +
>> +    for (i = 0; i < sc->drefs_count; i++) {
>> +        MOV_dref_t *dref = &sc->drefs[i];
>> +        uint32_t size = get_be32(pb);
>> +        offset_t next = url_ftell(pb) + size - 4;
>> +
>> +        dref->type = get_le32(pb);
>> +        get_be32(pb); // version + flags
>> +        dprintf(c->fc, "type %.4s size %d\n", (char*)&dref->type, size);
>> +
>> +        if (dref->type == MKTAG('a','l','i','s') && size > 150) {
>> +            /* macintosh alias record */
>> +            uint16_t volume_len, len;
>> +            char volume[28];
>> +            int16_t type;
>> +
>> +            url_fskip(pb, 10);
>> +
>> +            volume_len = get_byte(pb);
>> +            volume_len = FFMIN(volume_len, 27);
>> +            get_buffer(pb, volume, 27);
>> +            volume[volume_len] = 0;
>> +            av_log(c->fc, AV_LOG_DEBUG, "volume %s, len %d\n", volume, volume_len);
>> +
>> +            url_fskip(pb, 112);
>> +
>> +            for (type = 0; type != -1 && url_ftell(pb) < next; ) {
>> +                type = get_be16(pb);
>> +                len = get_be16(pb);
>> +                av_log(c->fc, AV_LOG_DEBUG, "type %d, len %d\n", type, len);
>> +                if (len&1)
>> +                    len += 1;
>> +                if (type == 2) { // absolute path
>> +                    dref->path = av_mallocz(len+1);
>> +                    get_buffer(pb, dref->path, len);
>> +                    if (!strncmp(dref->path, volume, volume_len)) {
>> +                        len -= volume_len;
>> +                        memmove(dref->path, dref->path+volume_len, len);
> 
> Lets assume the first byte of dref->path and volume are 0
> len=2
> volume_len=27
> then memmove() will be executed with a len of 65511 which is larger then the
> array
> 

Thanks, fixed.

-- 
Baptiste COUDURIER                              GnuPG Key Id: 0x5C1ABAAA
SMARTJOG S.A.                                    http://www.smartjog.com
Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
Phone: +33 1 49966312




More information about the ffmpeg-cvslog mailing list