There is a bug in enumerateUsedIDs found in swftools.c:

    case ST_DEFINEBUTTONSOUND: {
        int t;
        callback(tag, tag->pos + base, callback_data);
        for(t=0;t<4;t++) {
        int flags;
        callback(tag, tag->pos + base, callback_data);
        swf_GetU16(tag); //sound id
        flags = swf_GetU8(tag);
        if(flags&1)
            swf_GetU32(tag); // in point
        if(flags&2)
            swf_GetU32(tag); // out points
        if(flags&4)
            swf_GetU16(tag); // loop count
        if(flags&8)
        {
            int npoints = swf_GetU8(tag);
            int s;
            for(s=0;s<npoints;s++)
            {
            swf_GetU32(tag);
            swf_GetU16(tag);
            swf_GetU16(tag);
            }
        }
        }
        } break;

It should be popping off the first U16 for the button ID, and also check
each sound ID to see if it is zero or not.

The code should be:

    case ST_DEFINEBUTTONSOUND: {
        int t;
        callback(tag, tag->pos + base, callback_data);
        int buttonID = swf_GetU16(tag);  //button id     *FIX*
        for(t=0;t<4;t++) {
        int flags;
        callback(tag, tag->pos + base, callback_data);
        int soundID = swf_GetU16(tag); //sound id  *FIX*
        if (soundID != 0)  //  *FIX*
        {
        flags = swf_GetU8(tag);
        if(flags&1)
            swf_GetU32(tag); // in point
        if(flags&2)
            swf_GetU32(tag); // out points
        if(flags&4)
            swf_GetU16(tag); // loop count
        if(flags&8)
        {
            int npoints = swf_GetU8(tag);
            int s;
            for(s=0;s<npoints;s++)
            {
            swf_GetU32(tag);
            swf_GetU16(tag);
            swf_GetU16(tag);
            }
        }
        }
        }
        } break;

Reply via email to