diff options
author | Dave Chapman <dave@dchapman.com> | 2005-09-24 11:56:36 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2005-09-24 11:56:36 +0000 |
commit | cae670ff1fc1e9b9dff3132ed6e6f1df98c764d6 (patch) | |
tree | dd9d253b7ddb03e4ad32bde1acff56deead68f73 /apps | |
parent | ef26cd2af12acc608da44e25740d838c69677b96 (diff) | |
download | rockbox-cae670ff1fc1e9b9dff3132ed6e6f1df98c764d6.tar.gz rockbox-cae670ff1fc1e9b9dff3132ed6e6f1df98c764d6.zip |
Cascade errors back down to qtmovie_read() and correctly return an error on invalid ALAC files - should prevent crashes when attempting to play AAC files using ALAC decoder
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7556 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/codecs/libalac/demux.c | 69 |
1 files changed, 44 insertions, 25 deletions
diff --git a/apps/codecs/libalac/demux.c b/apps/codecs/libalac/demux.c index 23f6d82622..80963a2fce 100644 --- a/apps/codecs/libalac/demux.c +++ b/apps/codecs/libalac/demux.c | |||
@@ -133,7 +133,7 @@ static void read_chunk_hdlr(qtmovie_t *qtmovie, size_t chunk_len) | |||
133 | 133 | ||
134 | } | 134 | } |
135 | 135 | ||
136 | static void read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) | 136 | static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) |
137 | { | 137 | { |
138 | unsigned int i; | 138 | unsigned int i; |
139 | uint32_t numentries; | 139 | uint32_t numentries; |
@@ -154,7 +154,7 @@ static void read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) | |||
154 | if (numentries != 1) | 154 | if (numentries != 1) |
155 | { | 155 | { |
156 | //fprintf(stderr, "only expecting one entry in sample description atom!\n"); | 156 | //fprintf(stderr, "only expecting one entry in sample description atom!\n"); |
157 | return; | 157 | return false; |
158 | } | 158 | } |
159 | 159 | ||
160 | for (i = 0; i < numentries; i++) | 160 | for (i = 0; i < numentries; i++) |
@@ -249,9 +249,10 @@ static void read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) | |||
249 | { | 249 | { |
250 | // fprintf(stderr, "expecting 'alac' data format, got %c%c%c%c\n", | 250 | // fprintf(stderr, "expecting 'alac' data format, got %c%c%c%c\n", |
251 | // SPLITFOURCC(qtmovie->res->format)); | 251 | // SPLITFOURCC(qtmovie->res->format)); |
252 | return; | 252 | return false; |
253 | } | 253 | } |
254 | } | 254 | } |
255 | return true; | ||
255 | } | 256 | } |
256 | 257 | ||
257 | static void read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) | 258 | static void read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) |
@@ -333,7 +334,7 @@ static void read_chunk_stsz(qtmovie_t *qtmovie, size_t chunk_len) | |||
333 | } | 334 | } |
334 | } | 335 | } |
335 | 336 | ||
336 | static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len) | 337 | static bool read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len) |
337 | { | 338 | { |
338 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ | 339 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ |
339 | 340 | ||
@@ -346,7 +347,7 @@ static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len) | |||
346 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) | 347 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) |
347 | { | 348 | { |
348 | //fprintf(stderr, "strange size for chunk inside stbl\n"); | 349 | //fprintf(stderr, "strange size for chunk inside stbl\n"); |
349 | return; | 350 | return false; |
350 | } | 351 | } |
351 | 352 | ||
352 | sub_chunk_id = stream_read_uint32(qtmovie->stream); | 353 | sub_chunk_id = stream_read_uint32(qtmovie->stream); |
@@ -354,7 +355,9 @@ static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len) | |||
354 | switch (sub_chunk_id) | 355 | switch (sub_chunk_id) |
355 | { | 356 | { |
356 | case MAKEFOURCC('s','t','s','d'): | 357 | case MAKEFOURCC('s','t','s','d'): |
357 | read_chunk_stsd(qtmovie, sub_chunk_len); | 358 | if (!read_chunk_stsd(qtmovie, sub_chunk_len)) { |
359 | return false; | ||
360 | } | ||
358 | break; | 361 | break; |
359 | case MAKEFOURCC('s','t','t','s'): | 362 | case MAKEFOURCC('s','t','t','s'): |
360 | read_chunk_stts(qtmovie, sub_chunk_len); | 363 | read_chunk_stts(qtmovie, sub_chunk_len); |
@@ -370,14 +373,15 @@ static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len) | |||
370 | default: | 373 | default: |
371 | // fprintf(stderr, "(stbl) unknown chunk id: %c%c%c%c\n", | 374 | // fprintf(stderr, "(stbl) unknown chunk id: %c%c%c%c\n", |
372 | // SPLITFOURCC(sub_chunk_id)); | 375 | // SPLITFOURCC(sub_chunk_id)); |
373 | return; | 376 | return false; |
374 | } | 377 | } |
375 | 378 | ||
376 | size_remaining -= sub_chunk_len; | 379 | size_remaining -= sub_chunk_len; |
377 | } | 380 | } |
381 | return true; | ||
378 | } | 382 | } |
379 | 383 | ||
380 | static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) | 384 | static bool read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) |
381 | { | 385 | { |
382 | size_t dinf_size, stbl_size; | 386 | size_t dinf_size, stbl_size; |
383 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ | 387 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ |
@@ -386,12 +390,12 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) | |||
386 | if (stream_read_uint32(qtmovie->stream) != 16) | 390 | if (stream_read_uint32(qtmovie->stream) != 16) |
387 | { | 391 | { |
388 | //fprintf(stderr, "unexpected size in media info\n"); | 392 | //fprintf(stderr, "unexpected size in media info\n"); |
389 | return; | 393 | return false; |
390 | } | 394 | } |
391 | if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','m','h','d')) | 395 | if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','m','h','d')) |
392 | { | 396 | { |
393 | //fprintf(stderr, "not a sound header! can't handle this.\n"); | 397 | //fprintf(stderr, "not a sound header! can't handle this.\n"); |
394 | return; | 398 | return false; |
395 | } | 399 | } |
396 | /* now skip the rest */ | 400 | /* now skip the rest */ |
397 | stream_skip(qtmovie->stream, 16 - 8); | 401 | stream_skip(qtmovie->stream, 16 - 8); |
@@ -403,7 +407,7 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) | |||
403 | if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('d','i','n','f')) | 407 | if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('d','i','n','f')) |
404 | { | 408 | { |
405 | //fprintf(stderr, "expected dinf, didn't get it.\n"); | 409 | //fprintf(stderr, "expected dinf, didn't get it.\n"); |
406 | return; | 410 | return false; |
407 | } | 411 | } |
408 | /* skip it */ | 412 | /* skip it */ |
409 | stream_skip(qtmovie->stream, dinf_size - 8); | 413 | stream_skip(qtmovie->stream, dinf_size - 8); |
@@ -416,9 +420,12 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) | |||
416 | if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','t','b','l')) | 420 | if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','t','b','l')) |
417 | { | 421 | { |
418 | //fprintf(stderr, "expected stbl, didn't get it.\n"); | 422 | //fprintf(stderr, "expected stbl, didn't get it.\n"); |
419 | return; | 423 | return false; |
424 | } | ||
425 | if (!read_chunk_stbl(qtmovie, stbl_size)) { | ||
426 | return false; | ||
420 | } | 427 | } |
421 | read_chunk_stbl(qtmovie, stbl_size); | 428 | |
422 | size_remaining -= stbl_size; | 429 | size_remaining -= stbl_size; |
423 | 430 | ||
424 | if (size_remaining) | 431 | if (size_remaining) |
@@ -426,9 +433,10 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) | |||
426 | //fprintf(stderr, "oops\n"); | 433 | //fprintf(stderr, "oops\n"); |
427 | stream_skip(qtmovie->stream, size_remaining); | 434 | stream_skip(qtmovie->stream, size_remaining); |
428 | } | 435 | } |
436 | return true; | ||
429 | } | 437 | } |
430 | 438 | ||
431 | static void read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len) | 439 | static bool read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len) |
432 | { | 440 | { |
433 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ | 441 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ |
434 | 442 | ||
@@ -441,7 +449,7 @@ static void read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len) | |||
441 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) | 449 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) |
442 | { | 450 | { |
443 | //fprintf(stderr, "strange size for chunk inside mdia\n"); | 451 | //fprintf(stderr, "strange size for chunk inside mdia\n"); |
444 | return; | 452 | return false; |
445 | } | 453 | } |
446 | 454 | ||
447 | sub_chunk_id = stream_read_uint32(qtmovie->stream); | 455 | sub_chunk_id = stream_read_uint32(qtmovie->stream); |
@@ -455,20 +463,23 @@ static void read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len) | |||
455 | read_chunk_hdlr(qtmovie, sub_chunk_len); | 463 | read_chunk_hdlr(qtmovie, sub_chunk_len); |
456 | break; | 464 | break; |
457 | case MAKEFOURCC('m','i','n','f'): | 465 | case MAKEFOURCC('m','i','n','f'): |
458 | read_chunk_minf(qtmovie, sub_chunk_len); | 466 | if (!read_chunk_minf(qtmovie, sub_chunk_len)) { |
467 | return false; | ||
468 | } | ||
459 | break; | 469 | break; |
460 | default: | 470 | default: |
461 | // fprintf(stderr, "(mdia) unknown chunk id: %c%c%c%c\n", | 471 | // fprintf(stderr, "(mdia) unknown chunk id: %c%c%c%c\n", |
462 | // SPLITFOURCC(sub_chunk_id)); | 472 | // SPLITFOURCC(sub_chunk_id)); |
463 | return; | 473 | return false; |
464 | } | 474 | } |
465 | 475 | ||
466 | size_remaining -= sub_chunk_len; | 476 | size_remaining -= sub_chunk_len; |
467 | } | 477 | } |
478 | return true; | ||
468 | } | 479 | } |
469 | 480 | ||
470 | /* 'trak' - a movie track - contains other atoms */ | 481 | /* 'trak' - a movie track - contains other atoms */ |
471 | static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len) | 482 | static bool read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len) |
472 | { | 483 | { |
473 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ | 484 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ |
474 | 485 | ||
@@ -481,7 +492,7 @@ static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len) | |||
481 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) | 492 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) |
482 | { | 493 | { |
483 | //fprintf(stderr, "strange size for chunk inside trak\n"); | 494 | //fprintf(stderr, "strange size for chunk inside trak\n"); |
484 | return; | 495 | return false; |
485 | } | 496 | } |
486 | 497 | ||
487 | sub_chunk_id = stream_read_uint32(qtmovie->stream); | 498 | sub_chunk_id = stream_read_uint32(qtmovie->stream); |
@@ -492,7 +503,9 @@ static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len) | |||
492 | read_chunk_tkhd(qtmovie, sub_chunk_len); | 503 | read_chunk_tkhd(qtmovie, sub_chunk_len); |
493 | break; | 504 | break; |
494 | case MAKEFOURCC('m','d','i','a'): | 505 | case MAKEFOURCC('m','d','i','a'): |
495 | read_chunk_mdia(qtmovie, sub_chunk_len); | 506 | if (!read_chunk_mdia(qtmovie, sub_chunk_len)) { |
507 | return false; | ||
508 | } | ||
496 | break; | 509 | break; |
497 | default: | 510 | default: |
498 | // fprintf(stderr, "(trak) unknown chunk id: %c%c%c%c\n", | 511 | // fprintf(stderr, "(trak) unknown chunk id: %c%c%c%c\n", |
@@ -503,6 +516,7 @@ static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len) | |||
503 | 516 | ||
504 | size_remaining -= sub_chunk_len; | 517 | size_remaining -= sub_chunk_len; |
505 | } | 518 | } |
519 | return true; | ||
506 | } | 520 | } |
507 | 521 | ||
508 | /* 'mvhd' movie header atom */ | 522 | /* 'mvhd' movie header atom */ |
@@ -524,7 +538,7 @@ static void read_chunk_udta(qtmovie_t *qtmovie, size_t chunk_len) | |||
524 | } | 538 | } |
525 | 539 | ||
526 | /* 'moov' movie atom - contains other atoms */ | 540 | /* 'moov' movie atom - contains other atoms */ |
527 | static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len) | 541 | static bool read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len) |
528 | { | 542 | { |
529 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ | 543 | size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ |
530 | 544 | ||
@@ -537,7 +551,7 @@ static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len) | |||
537 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) | 551 | if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) |
538 | { | 552 | { |
539 | //fprintf(stderr, "strange size for chunk inside moov\n"); | 553 | //fprintf(stderr, "strange size for chunk inside moov\n"); |
540 | return; | 554 | return false; |
541 | } | 555 | } |
542 | 556 | ||
543 | sub_chunk_id = stream_read_uint32(qtmovie->stream); | 557 | sub_chunk_id = stream_read_uint32(qtmovie->stream); |
@@ -548,7 +562,9 @@ static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len) | |||
548 | read_chunk_mvhd(qtmovie, sub_chunk_len); | 562 | read_chunk_mvhd(qtmovie, sub_chunk_len); |
549 | break; | 563 | break; |
550 | case MAKEFOURCC('t','r','a','k'): | 564 | case MAKEFOURCC('t','r','a','k'): |
551 | read_chunk_trak(qtmovie, sub_chunk_len); | 565 | if (!read_chunk_trak(qtmovie, sub_chunk_len)) { |
566 | return false; | ||
567 | } | ||
552 | break; | 568 | break; |
553 | case MAKEFOURCC('u','d','t','a'): | 569 | case MAKEFOURCC('u','d','t','a'): |
554 | read_chunk_udta(qtmovie, sub_chunk_len); | 570 | read_chunk_udta(qtmovie, sub_chunk_len); |
@@ -556,11 +572,12 @@ static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len) | |||
556 | default: | 572 | default: |
557 | // fprintf(stderr, "(moov) unknown chunk id: %c%c%c%c\n", | 573 | // fprintf(stderr, "(moov) unknown chunk id: %c%c%c%c\n", |
558 | // SPLITFOURCC(sub_chunk_id)); | 574 | // SPLITFOURCC(sub_chunk_id)); |
559 | return; | 575 | return false; |
560 | } | 576 | } |
561 | 577 | ||
562 | size_remaining -= sub_chunk_len; | 578 | size_remaining -= sub_chunk_len; |
563 | } | 579 | } |
580 | return true; | ||
564 | } | 581 | } |
565 | 582 | ||
566 | static void read_chunk_mdat(qtmovie_t *qtmovie, size_t chunk_len) | 583 | static void read_chunk_mdat(qtmovie_t *qtmovie, size_t chunk_len) |
@@ -608,7 +625,9 @@ int qtmovie_read(stream_t *file, demux_res_t *demux_res) | |||
608 | read_chunk_ftyp(&qtmovie, chunk_len); | 625 | read_chunk_ftyp(&qtmovie, chunk_len); |
609 | break; | 626 | break; |
610 | case MAKEFOURCC('m','o','o','v'): | 627 | case MAKEFOURCC('m','o','o','v'): |
611 | read_chunk_moov(&qtmovie, chunk_len); | 628 | if (!read_chunk_moov(&qtmovie, chunk_len)) { |
629 | return 0; | ||
630 | } | ||
612 | break; | 631 | break; |
613 | /* once we hit mdat we stop reading and return. | 632 | /* once we hit mdat we stop reading and return. |
614 | * this is on the assumption that there is no furhter interesting | 633 | * this is on the assumption that there is no furhter interesting |