Skip to content

Fix/hardsubx error handling#2162

Open
SuvidhJ wants to merge 4 commits intoCCExtractor:masterfrom
SuvidhJ:fix/hardsubx-error-handling
Open

Fix/hardsubx error handling#2162
SuvidhJ wants to merge 4 commits intoCCExtractor:masterfrom
SuvidhJ:fix/hardsubx-error-handling

Conversation

@SuvidhJ
Copy link

@SuvidhJ SuvidhJ commented Mar 1, 2026

[FIX] Fix resource leaks, missing NULL checks, and missing return in hardsubx.c

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.

What does this PR do?

Fixes several error-handling issues in src/lib_ccx/hardsubx.c across both _init_hardsubx() and hardsubx_process_data().

Changes in _init_hardsubx()

  • Added NULL check for TessBaseAPICreate(): The return value was never validated. If it returned NULL, every subsequent Tesseract call would hit undefined behavior.

  • Added NULL checks for both strdup() calls: pars_vec and pars_values were used without checking if strdup() succeeded. On memory allocation failure these would be NULL pointers passed into TessBaseAPIInit4().

  • Added TessBaseAPIDelete() in error paths: When tessdata_path lookup failed or TessBaseAPIInit4() returned non-zero, the code called free(ctx) without first deleting the Tesseract handle that was already created. This leaked the handle every time one of these error paths was hit.

Changes in hardsubx_process_data()

  • Added missing return statement: The function is declared as returning int but never actually returned a value, which is undefined behavior per the C standard.

  • Added NULL checks for av_malloc(), sws_getContext(), and init_encoder(): All three can return NULL on failure, but the results were being used directly without any validation.

  • Replaced per-error cleanup with goto cleanup pattern: Previously, each fatal() call would exit without freeing any of the FFmpeg resources allocated up to that point (codec context, format context, frames, buffers, etc.). Now all error paths jump to a centralized cleanup section that safely frees everything that was allocated.

Issues Fixed

Fixes #2158
Fixes #2160
Fixes #2161

Testing

  • Changes are limited to error-handling paths only . The normal execution flow is completely unchanged
  • All cleanup uses NULL-safe functions (free(NULL) is a no-op per the C standard, av_frame_free() and avcodec_free_context() handle NULL pointers )
  • No new dependencies or behavioral changes introduced

SuvidhJ added 2 commits March 2, 2026 04:49
Added error handling for memory allocation and codec initialization in hardsubx_process_data function.
Added comment to clarify the purpose of the hardsubx function.
@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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants