This avoids accessing NULL pointers in case of error.
Unified · Split
| @@ -324,31 +324,50 @@ av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v) · 323 unmodified lines | ||
| 324 | 324 | v->fieldtx_plane = av_mallocz(s->mb_stride * mb_height); |
| 325 | 325 | v->acpred_plane = av_malloc (s->mb_stride * mb_height); |
| 326 | 326 | v->over_flags_plane = av_malloc (s->mb_stride * mb_height); |
| 327 | + if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->forward_mb_plane || | |
| 328 | + !v->fieldtx_plane || !v->acpred_plane || !v->over_flags_plane) | |
| 329 | + goto error; | |
| 327 | 330 | |
| 328 | 331 | v->n_allocated_blks = s->mb_width + 2; |
| 329 | 332 | v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks); |
| 330 | 333 | v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride); |
| 334 | + if (!v->block || !v->cbp_base) | |
| 335 | + goto error; | |
| 331 | 336 | v->cbp = v->cbp_base + s->mb_stride; |
| 332 | 337 | v->ttblk_base = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride); |
| 338 | + if (!v->ttblk_base) | |
| 339 | + goto error; | |
| 333 | 340 | v->ttblk = v->ttblk_base + s->mb_stride; |
| 334 | 341 | v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride); |
| 342 | + if (!v->is_intra_base) | |
| 343 | + goto error; | |
| 335 | 344 | v->is_intra = v->is_intra_base + s->mb_stride; |
| 336 | 345 | v->luma_mv_base = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride); |
| 346 | + if (!v->luma_mv_base) | |
| 347 | + goto error; | |
| 337 | 348 | v->luma_mv = v->luma_mv_base + s->mb_stride; |
| 338 | 349 | |
| 339 | 350 | /* allocate block type info in that way so it could be used with s->block_index[] */ |
| 340 | 351 | v->mb_type_base = av_malloc(s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2); |
| 352 | + if (!v->mb_type_base) | |
| 353 | + goto error; | |
| 341 | 354 | v->mb_type[0] = v->mb_type_base + s->b8_stride + 1; |
| 342 | 355 | v->mb_type[1] = v->mb_type_base + s->b8_stride * (mb_height * 2 + 1) + s->mb_stride + 1; |
| 343 | 356 | v->mb_type[2] = v->mb_type[1] + s->mb_stride * (mb_height + 1); |
| 344 | 357 | |
| 345 | 358 | /* allocate memory to store block level MV info */ |
| 346 | 359 | v->blk_mv_type_base = av_mallocz( s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2); |
| 360 | + if (!v->blk_mv_type_base) | |
| 361 | + goto error; | |
| 347 | 362 | v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1; |
| 348 | 363 | v->mv_f_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2)); |
| 364 | + if (!v->mv_f_base) | |
| 365 | + goto error; | |
| 349 | 366 | v->mv_f[0] = v->mv_f_base + s->b8_stride + 1; |
| 350 | 367 | v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2); |
| 351 | 368 | v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2)); |
| 369 | + if (!v->mv_f_next_base) | |
| 370 | + goto error; | |
| 352 | 371 | v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1; |
| 353 | 372 | v->mv_f_next[1] = v->mv_f_next[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2); |
| 354 | 373 | |
| @@ -362,12 +381,6 @@ av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v) · 7 unmodified lines | ||
| 362 | 381 | } |
| 363 | 382 | } |
| 364 | 383 | |
| 365 | − if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane || | |
| 366 | − !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base || | |
| 367 | − !v->mb_type_base) { | |
| 368 | − goto error; | |
| 369 | − } | |
| 370 | − | |
| 371 | 384 | return 0; |
| 372 | 385 | |
| 373 | 386 | error: |