CCExtractor / CCExtractor/ccextractor

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

Aberta
#2,165 1 comentário 0 reações 0 responsáveis Ver no GitHub
Linguagem predominante
C
Estrelas
903
Forks
589
Merge médio
3d 2h
PRs com merge (30d)
10

Descrição

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

Guia de contribuição

Abrir o guia de contribuição

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.