Unified · Split
| @@ -1227,7 +1227,7 @@ static int mkv_blockgroup_size(int pkt_size) · 1226 unmodified lines | ||
| 1227 | 1227 | return size; |
| 1228 | 1228 | } |
| 1229 | 1229 | |
| 1230 | −static int ass_get_duration(const uint8_t *p) | |
| 1230 | +static int ass_get_duration(AVFormatContext *s, const uint8_t *p) | |
| 1231 | 1231 | { |
| 1232 | 1232 | int sh, sm, ss, sc, eh, em, es, ec; |
| 1233 | 1233 | uint64_t start, end; |
| @@ -1235,8 +1235,25 @@ static int ass_get_duration(const uint8_t *p) · 1 unmodified line | ||
| 1235 | 1235 | if (sscanf(p, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d", |
| 1236 | 1236 | &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8) |
| 1237 | 1237 | return 0; |
| 1238 | + | |
| 1239 | + if (sh > 9 || sm > 59 || ss > 59 || sc > 99 || | |
| 1240 | + eh > 9 || em > 59 || es > 59 || ec > 99) { | |
| 1241 | + av_log(s, AV_LOG_WARNING, | |
| 1242 | + "Non-standard time reference %d:%d:%d.%d,%d:%d:%d.%d\n", | |
| 1243 | + sh, sm, ss, sc, eh, em, es, ec); | |
| 1244 | + return 0; | |
| 1245 | + } | |
| 1246 | + | |
| 1238 | 1247 | start = 3600000 * sh + 60000 * sm + 1000 * ss + 10 * sc; |
| 1239 | 1248 | end = 3600000 * eh + 60000 * em + 1000 * es + 10 * ec; |
| 1249 | + | |
| 1250 | + if (start > end) { | |
| 1251 | + av_log(s, AV_LOG_WARNING, | |
| 1252 | + "Unexpected time reference %d:%d:%d.%d,%d:%d:%d.%d\n", | |
| 1253 | + sh, sm, ss, sc, eh, em, es, ec); | |
| 1254 | + return 0; | |
| 1255 | + } | |
| 1256 | + | |
| 1240 | 1257 | return end - start; |
| 1241 | 1258 | } |
| 1242 | 1259 | |
| @@ -1250,7 +1267,7 @@ static int mkv_write_ass_blocks(AVFormatContext *s, AVIOContext *pb, · 7 unmodified lines | ||
| 1250 | 1267 | char buffer[2048]; |
| 1251 | 1268 | |
| 1252 | 1269 | while (data_size) { |
| 1253 | − int duration = ass_get_duration(data); | |
| 1270 | + int duration = ass_get_duration(s, data); | |
| 1254 | 1271 | max_duration = FFMAX(duration, max_duration); |
| 1255 | 1272 | end = memchr(data, '\n', data_size); |
| 1256 | 1273 | size = line_size = end ? end - data + 1 : data_size; |