CCExtractor / CCExtractor/ccextractor

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

Ouverte
#2,165 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
C
Étoiles
903
Forks
589
Merge moyen
3 j 2 h
PR mergées (30 j)
10

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:
```c
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`:
```c
// 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;
}
}
```

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.