Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[BUG]: Last EIT section never parsed — EPG_free() discards pending epg_buffers without flushing

Open
#2,165 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

  • #2166 by @Varadraj75 — closed without merging

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
55/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Stale
Tech stack
c
Domain
backend

Research direction

Read src/lib_ccx/ts_tables_epg.c, starting with EPG_free(), parse_EPG_packet(), and EPG_parse_table(). Trace how pending epg_buffers entries are represented and inspect the related XXX hack in EPG_DVB_decode_EIT(). Done means the final accumulated EIT section is processed before buffers are released without introducing the reported segfault.

Written by the indexing model from the issue text.

Description

Summary

In src/lib_ccx/ts_tables_epg.c, the last EIT section in any stream is silently
discarded because EPG_free() frees epg_buffers without first flushing
accumulated data.

Root Cause

parse_EPG_packet() accumulates TS packets into epg_buffers[] and only calls
EPG_parse_table() when a new section starts (payload_start_indicator=1).
This means the last accumulated section is never parsed — there is no
following packet to trigger the flush.

EPG_free() then frees the buffers without processing them:

void EPG_free(struct lib_ccx_ctx *ctx)
{
    // ... output logic ...
    free(ctx->epg_buffers);   // ← pending data discarded here!
    free(ctx->eit_programs);
}

Impact

  • The last EIT table section in every stream is lost
  • For short streams or streams with few EIT sections, this can mean entire
    programs are missing from XMLTV output
  • There is a related XXX hack comment in EPG_DVB_decode_EIT() at line 1420
    that was added to prevent a segfault caused by this same issue

Fix

In EPG_free(), before freeing, iterate over all epg_buffers slots and
flush any with ccounter > 0:

// Flush any pending EIT sections before freeing
for (int i = 0; i <= 0xfff; i++) {
    if (ctx->epg_buffers[i].buffer != NULL && ctx->epg_buffers[i].ccounter > 0) {
        EPG_parse_table(ctx, ctx->epg_buffers[i].buffer, 
                        ctx->epg_buffers[i].buffer_length);
        free(ctx->epg_buffers[i].buffer);
        ctx->epg_buffers[i].buffer = NULL;
    }
}
Dominant language
C
Stars
901
Forks
592
Avg merge
5d 19h
Merged PRs (30d)
5

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from CCExtractor/ccextractor

All issues in CCExtractor/ccextractor

Similar issues

More C issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.