Skip to content

Implement error handling to default language allocation in matroska.c#2163

Closed
SuvidhJ wants to merge 3 commits intoCCExtractor:masterfrom
SuvidhJ:fix/matroska.c-error-handling
Closed

Implement error handling to default language allocation in matroska.c#2163
SuvidhJ wants to merge 3 commits intoCCExtractor:masterfrom
SuvidhJ:fix/matroska.c-error-handling

Conversation

@SuvidhJ
Copy link

@SuvidhJ SuvidhJ commented Mar 2, 2026

In raising this pull request, I confirm the following (please check boxes):

  • I have read and understood the contributors guide.
  • I have checked that another pull request for this purpose does not exist.
  • I have considered, and confirmed that this submission will be valuable to others.
  • I accept that this submission may not be used, and the pull request closed at the will of the maintainer.
  • I give this submission freely, and claim no ownership to its content.
  • I have mentioned this change in the changelog.

My familiarity with the project is as follows (check one):

  • I have never used CCExtractor.
  • I have used CCExtractor just a couple of times.
  • I absolutely love CCExtractor, but have not contributed previously.
  • I am an active contributor to CCExtractor.

Summary

In parse_segment_track_entry() (src/lib_ccx/matroska.c), the default language is set via strdup("eng"), but the return value is never checked for NULL. If allocation fails, lang would be NULL and could cause a segfault when it's later passed to strcmp(), memcpy(), or assigned to the track struct.

This PR adds the missing NULL checks so the program exits gracefully with a clear out-of-memory message instead of crashing unpredictably.

What changed

  • initial default assignment: Added a NULL check with fatal(EXIT_NOT_ENOUGH_MEMORY, ...) immediately after char *lang = strdup("eng");.
  • Inside the MATROSKA_SEGMENT_TRACK_LANGUAGE_IETF case (second strdup("eng")): Added the same NULL check after the fallback re-assignment of lang.

Why this matters

  • Every allocation in this file : malloc, realloc, calloc, already follows the pattern of checking for NULL and calling fatal(). These two strdup() calls were the only ones missing that safety net. While an OOM on a 4-byte allocation is admittedly rare, it's an edge case that static analyzers flag and that can cause hard-to-diagnose crashes in memory-constrained environments.

Related Issue : Fixes #2159

@ccextractor-bot
Copy link
Collaborator

CCExtractor CI platform finished running the test files on linux. Below is a summary of the test results, when compared to test for commit f377be9...:
Report Name Tests Passed
Broken 13/13
CEA-708 14/14
DVB 7/7
DVD 3/3
DVR-MS 2/2
General 27/27
Hardsubx 1/1
Hauppage 3/3
MP4 3/3
NoCC 10/10
Options 86/86
Teletext 21/21
WTV 13/13
XDS 34/34

Congratulations: Merging this PR would fix the following tests:

  • ccextractor --autoprogram --out=srt --latin1 --quant 0 85271be4d2..., Last passed: Never
  • ccextractor --autoprogram --out=ttxt --latin1 --ucla dab1c1bd65..., Last passed: Never
  • ccextractor --out=srt --latin1 --autoprogram 29e5ffd34b..., Last passed: Never
  • ccextractor --out=spupng c83f765c66..., Last passed: Never
  • ccextractor --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
  • ccextractor --startcreditsnotbefore 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
  • ccextractor --startcreditsnotafter 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
  • ccextractor --startcreditsforatleast 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
  • ccextractor --startcreditsforatmost 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never

All tests passed completely.

Check the result page for more info.

@ccextractor-bot
Copy link
Collaborator

CCExtractor CI platform finished running the test files on windows. Below is a summary of the test results, when compared to test for commit f377be9...:
Report Name Tests Passed
Broken 13/13
CEA-708 14/14
DVB 6/7
DVD 3/3
DVR-MS 2/2
General 25/27
Hardsubx 1/1
Hauppage 3/3
MP4 3/3
NoCC 10/10
Options 80/86
Teletext 21/21
WTV 13/13
XDS 34/34

Your PR breaks these cases:

  • ccextractor --autoprogram --out=srt --latin1 --quant 0 85271be4d2...
  • ccextractor --autoprogram --out=ttxt --latin1 --ucla dab1c1bd65...
  • ccextractor --out=srt --latin1 --autoprogram 29e5ffd34b...
  • ccextractor --out=spupng c83f765c66...
  • ccextractor --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
  • ccextractor --startcreditsnotbefore 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
  • ccextractor --startcreditsnotafter 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
  • ccextractor --startcreditsforatleast 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
  • ccextractor --startcreditsforatmost 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...

It seems that not all tests were passed completely. This is an indication that the output of some files is not as expected (but might be according to you).

Check the result page for more info.

@cfsmp3
Copy link
Contributor

cfsmp3 commented Mar 7, 2026

Closing — the first hunk is missing the fatal call. This:

if (lang == NULL)
    (EXIT_NOT_ENOUGH_MEMORY, "In parse_segment_track_entry: Out of memory allocating default language.");

is just a comma operator expression that does nothing. It wouldn't even catch the error. Also uses spaces instead of tabs.

@cfsmp3 cfsmp3 closed this Mar 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Unchecked strdup return value in matroska.c

3 participants