CCExtractor / CCExtractor/ccextractor

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

未关闭
#2,165 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
C
星标
903
派生
589
平均合并
3 天 2 小时
30 天内合并 PR
10

描述

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

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。