static int mpc8_probe(AVProbeData *p)
{
- if (AV_RL32(p->buf) == TAG_MPCK)
+ if (p->buf_size < 16)
+ return 0;
+ if (AV_RL32(p->buf) != TAG_MPCK)
+ return 0;
+ if (p->buf[4] == 'S' && p->buf[5] == 'H') {
+ int size = p->buf[6];
+
+ if (size < 12 || size > 30)
+ return 0;
+ if (!AV_RL32(&p->buf[7])) //zero CRC is invalid
+ return 0;
+ //check whether some tag follows stream header or not
+ if (p->buf[4 + size] < 'A' || p->buf[4 + size] > 'Z')
+ return 0;
+ if (p->buf[5 + size] < 'A' || p->buf[5 + size] > 'Z')
+ return 0;
+ if (p->buf[6 + size] < 3)
+ return 0;
return AVPROBE_SCORE_MAX;
- return 0;
+ }
+ /* file magic number should be followed by tag name which consists of
+ two uppercase letters */
+ if (p->buf[4] < 'A' || p->buf[4] > 'Z' || p->buf[5] < 'A' || p->buf[5] > 'Z')
+ return 0;
+ // tag size should be >= 3
+ if (p->buf[6] < 3)
+ return 0;
+ // if first tag is not stream header, that's suspicious
+ return AVPROBE_SCORE_MAX / 4;
}
static inline int64_t gb_get_v(GetBitContext *gb)