Skip to content

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

@Varadraj75

Description

@Varadraj75

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;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions