Commit 9b62d74a authored by Jean-Paul Saman's avatar Jean-Paul Saman

src/tables: solve potential memleaks.

parent b8303d17
......@@ -194,7 +194,7 @@ void dvbpsi_DeleteDemuxSubDecoder(dvbpsi_demux_subdec_t *p_subdec)
if (!p_subdec)
return;
/* FIXME: find a saner way to release private decoder resources */
free(p_subdec->p_decoder);
dvbpsi_DeleteDecoder(p_subdec->p_decoder);
free(p_subdec);
p_subdec = NULL;
}
......
......@@ -158,17 +158,18 @@ void dvbpsi_atsc_DetachEIT(dvbpsi_t * p_dvbpsi, uint8_t i_table_id, uint16_t i_e
return;
if (p_eit_decoder->p_building_eit)
free(p_eit_decoder->p_building_eit);
dvbpsi_atsc_DeleteEIT(p_eit_decoder->p_building_eit);
p_eit_decoder->p_building_eit = NULL;
for (unsigned int i = 0; i < 256; i++)
{
if (p_eit_decoder->ap_sections[i])
{
dvbpsi_DeletePSISections(p_eit_decoder->ap_sections[i]);
p_eit_decoder->ap_sections[i] = NULL;
}
}
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
dvbpsi_DeleteDemuxSubDecoder(p_subdec);
}
......@@ -402,7 +403,7 @@ static void dvbpsi_atsc_GatherEITSections(dvbpsi_t * p_dvbpsi,
/* Free structures */
if (p_eit_decoder->p_building_eit)
{
free(p_eit_decoder->p_building_eit);
dvbpsi_atsc_DeleteEIT(p_eit_decoder->p_building_eit);
p_eit_decoder->p_building_eit = NULL;
}
/* Clear the section array */
......
......@@ -144,8 +144,9 @@ void dvbpsi_atsc_DetachETT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_ex
assert(p_dvbpsi);
assert(p_dvbpsi->p_private);
dvbpsi_demux_subdec_t* p_subdec;
dvbpsi_demux_t *p_demux = (dvbpsi_demux_t *) p_dvbpsi->p_private;
dvbpsi_demux_subdec_t* p_subdec;
p_subdec = dvbpsi_demuxGetSubDec(p_demux, i_table_id, i_extension);
if (p_subdec == NULL)
{
......@@ -168,9 +169,6 @@ void dvbpsi_atsc_DetachETT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_ex
free(p_etm_version);
}
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
dvbpsi_DeleteDemuxSubDecoder(p_subdec);
}
......
......@@ -163,17 +163,18 @@ void dvbpsi_atsc_DetachMGT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_ex
return;
if (p_mgt_decoder->p_building_mgt)
free(p_mgt_decoder->p_building_mgt);
dvbpsi_atsc_DeleteMGT(p_mgt_decoder->p_building_mgt);
p_mgt_decoder->p_building_mgt = NULL;
for (unsigned int i = 0; i < 256; i++)
{
if (p_mgt_decoder->ap_sections[i])
{
dvbpsi_DeletePSISections(p_mgt_decoder->ap_sections[i]);
p_mgt_decoder->ap_sections[i] = NULL;
}
}
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
dvbpsi_DeleteDemuxSubDecoder(p_subdec);
}
......@@ -436,7 +437,7 @@ static void dvbpsi_atsc_GatherMGTSections(dvbpsi_t * p_dvbpsi,
/* Free structures */
if(p_mgt_decoder->p_building_mgt)
{
free(p_mgt_decoder->p_building_mgt);
dvbpsi_atsc_DeleteMGT(p_mgt_decoder->p_building_mgt);
p_mgt_decoder->p_building_mgt = NULL;
}
/* Clear the section array */
......
......@@ -138,9 +138,6 @@ void dvbpsi_atsc_DetachSTT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_ex
if(!p_stt_decoder)
return;
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
dvbpsi_DeleteDemuxSubDecoder(p_subdec);
}
......
......@@ -172,15 +172,18 @@ void dvbpsi_atsc_DetachVCT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_ex
p_vct_decoder = (dvbpsi_atsc_vct_decoder_t*)p_subdec->p_decoder;
if (!p_vct_decoder)
return;
free(p_vct_decoder->p_building_vct);
if (p_vct_decoder->p_building_vct)
dvbpsi_atsc_DeleteVCT(p_vct_decoder->p_building_vct);
p_vct_decoder->p_building_vct = NULL;
for (unsigned int i = 0; i < 256; i++)
{
if (p_vct_decoder->ap_sections[i])
{
dvbpsi_DeletePSISections(p_vct_decoder->ap_sections[i]);
p_vct_decoder->ap_sections[i] = NULL;
}
}
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
dvbpsi_DeleteDemuxSubDecoder(p_subdec);
......@@ -473,7 +476,7 @@ static void dvbpsi_atsc_GatherVCTSections(dvbpsi_t *p_dvbpsi,
/* Free structures */
if(p_vct_decoder->p_building_vct)
{
free(p_vct_decoder->p_building_vct);
dvbpsi_atsc_DeleteVCT(p_vct_decoder->p_building_vct);
p_vct_decoder->p_building_vct = NULL;
}
......
......@@ -62,7 +62,6 @@ bool dvbpsi_AttachBAT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id,
assert(p_dvbpsi->p_private);
dvbpsi_demux_t* p_demux = (dvbpsi_demux_t*)p_dvbpsi->p_private;
if (dvbpsi_demuxGetSubDec(p_demux, i_table_id, i_extension))
{
dvbpsi_error(p_dvbpsi, "BAT decoder",
......@@ -128,15 +127,18 @@ void dvbpsi_DetachBAT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_extensi
dvbpsi_bat_decoder_t* p_bat_decoder;
p_bat_decoder = (dvbpsi_bat_decoder_t*)p_subdec->p_decoder;
free(p_bat_decoder->p_building_bat);
if (p_bat_decoder->p_building_bat)
dvbpsi_DeleteBAT(p_bat_decoder->p_building_bat);
p_bat_decoder->p_building_bat = NULL;
for (unsigned int i = 0; i < 256; i++)
{
if (p_bat_decoder->ap_sections[i])
{
dvbpsi_DeletePSISections(p_bat_decoder->ap_sections[i]);
p_bat_decoder->ap_sections[i] = NULL;
}
}
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
dvbpsi_DeleteDemuxSubDecoder(p_subdec);
......@@ -391,7 +393,7 @@ void dvbpsi_GatherBATSections(dvbpsi_t *p_dvbpsi,
/* Free structures */
if (p_bat_decoder->p_building_bat)
{
free(p_bat_decoder->p_building_bat);
dvbpsi_DeleteBAT(p_bat_decoder->p_building_bat);
p_bat_decoder->p_building_bat = NULL;
}
/* Clear the section array */
......
......@@ -91,15 +91,20 @@ void dvbpsi_DetachCAT(dvbpsi_t *p_dvbpsi)
dvbpsi_cat_decoder_t* p_cat_decoder
= (dvbpsi_cat_decoder_t*)p_dvbpsi->p_private;
free(p_cat_decoder->p_building_cat);
if (p_cat_decoder->p_building_cat)
dvbpsi_DeleteCAT(p_cat_decoder->p_building_cat);
p_cat_decoder->p_building_cat = NULL;
for (unsigned int i = 0; i <= 255; i++)
{
if (p_cat_decoder->ap_sections[i])
free(p_cat_decoder->ap_sections[i]);
{
dvbpsi_DeletePSISections(p_cat_decoder->ap_sections[i]);
p_cat_decoder->ap_sections[i] = NULL;
}
}
dvbpsi_DeleteDecoder((dvbpsi_decoder_t *)p_dvbpsi->p_private);
dvbpsi_DeleteDecoder(p_dvbpsi->p_private);
p_dvbpsi->p_private = NULL;
}
......@@ -110,6 +115,8 @@ void dvbpsi_DetachCAT(dvbpsi_t *p_dvbpsi)
*****************************************************************************/
void dvbpsi_InitCAT(dvbpsi_cat_t* p_cat, uint8_t i_version, bool b_current_next)
{
assert(p_cat);
p_cat->i_version = i_version;
p_cat->b_current_next = b_current_next;
p_cat->p_first_descriptor = NULL;
......@@ -250,7 +257,7 @@ void dvbpsi_GatherCATSections(dvbpsi_t *p_dvbpsi,
/* Free structures */
if (p_cat_decoder->p_building_cat)
{
free(p_cat_decoder->p_building_cat);
dvbpsi_DeleteCAT(p_cat_decoder->p_building_cat);
p_cat_decoder->p_building_cat = NULL;
}
/* Clear the section array */
......
......@@ -127,15 +127,18 @@ void dvbpsi_DetachEIT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id,
dvbpsi_eit_decoder_t* p_eit_decoder;
p_eit_decoder = (dvbpsi_eit_decoder_t*)p_subdec->p_decoder;
free(p_eit_decoder->p_building_eit);
if (p_eit_decoder->p_building_eit)
dvbpsi_DeleteEIT(p_eit_decoder->p_building_eit);
p_eit_decoder->p_building_eit = NULL;
for (unsigned int i = 0; i <= 255; i++)
{
if (p_eit_decoder->ap_sections[i])
{
dvbpsi_DeletePSISections(p_eit_decoder->ap_sections[i]);
p_eit_decoder->ap_sections[i] = NULL;
}
}
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
dvbpsi_DeleteDemuxSubDecoder(p_subdec);
......@@ -355,13 +358,13 @@ void dvbpsi_GatherEITSections(dvbpsi_t *p_dvbpsi, dvbpsi_decoder_t *p_private_de
/* Free structures */
if (p_eit_decoder->p_building_eit)
{
free(p_eit_decoder->p_building_eit);
dvbpsi_DeleteEIT(p_eit_decoder->p_building_eit);
p_eit_decoder->p_building_eit = NULL;
}
/* Clear the section array */
for (unsigned int i = 0; i <= 255; i++)
{
if(p_eit_decoder->ap_sections[i] != NULL)
if (p_eit_decoder->ap_sections[i] != NULL)
{
dvbpsi_DeletePSISections(p_eit_decoder->ap_sections[i]);
p_eit_decoder->ap_sections[i] = NULL;
......
......@@ -116,7 +116,7 @@ void dvbpsi_DetachNIT(dvbpsi_t * p_dvbpsi, uint8_t i_table_id,
dvbpsi_demux_subdec_t* p_subdec;
p_subdec = dvbpsi_demuxGetSubDec(p_demux, i_table_id, i_extension);
if(p_demux == NULL)
if (p_subdec == NULL)
{
dvbpsi_error(p_dvbpsi, "NIT Decoder",
"No such NIT decoder (table_id == 0x%02x,"
......@@ -127,15 +127,18 @@ void dvbpsi_DetachNIT(dvbpsi_t * p_dvbpsi, uint8_t i_table_id,
dvbpsi_nit_decoder_t* p_nit_decoder;
p_nit_decoder = (dvbpsi_nit_decoder_t*)p_subdec->p_decoder;
free(p_nit_decoder->p_building_nit);
if (p_nit_decoder->p_building_nit)
dvbpsi_DeleteNIT(p_nit_decoder->p_building_nit);
p_nit_decoder->p_building_nit = NULL;
for (unsigned int i = 0; i <= 255; i++)
{
if (p_nit_decoder->ap_sections[i])
{
dvbpsi_DeletePSISections(p_nit_decoder->ap_sections[i]);
p_nit_decoder->ap_sections[i] = NULL;
}
}
free(p_subdec->p_decoder);
p_subdec->p_decoder = NULL;
/* Free demux sub table decoder */
dvbpsi_DetachDemuxSubDecoder(p_demux, p_subdec);
......@@ -373,7 +376,7 @@ void dvbpsi_GatherNITSections(dvbpsi_t *p_dvbpsi,
/* Free structures */
if(p_nit_decoder->p_building_nit)
{
free(p_nit_decoder->p_building_nit);
dvbpsi_DeleteNIT(p_nit_decoder->p_building_nit);
p_nit_decoder->p_building_nit = NULL;
}
/* Clear the section array */
......
......@@ -89,15 +89,18 @@ void dvbpsi_DetachPAT(dvbpsi_t *p_dvbpsi)
assert(p_dvbpsi->p_private);
dvbpsi_pat_decoder_t* p_pat_decoder = (dvbpsi_pat_decoder_t*)p_dvbpsi->p_private;
free(p_pat_decoder->p_building_pat);
if (p_pat_decoder->p_building_pat)
dvbpsi_DeletePAT(p_pat_decoder->p_building_pat);
p_pat_decoder->p_building_pat = NULL;
for (unsigned int i = 0; i <= 255; i++)
{
if (p_pat_decoder->ap_sections[i])
free(p_pat_decoder->ap_sections[i]);
dvbpsi_DeletePSISections(p_pat_decoder->ap_sections[i]);
p_pat_decoder->ap_sections[i] = NULL;
}
dvbpsi_DeleteDecoder((dvbpsi_decoder_t *)p_dvbpsi->p_private);
dvbpsi_DeleteDecoder(p_dvbpsi->p_private);
p_dvbpsi->p_private = NULL;
}
......@@ -204,7 +207,7 @@ static void dvbpsi_ReInitPAT(dvbpsi_pat_decoder_t* p_pat_decoder, const bool b_f
/* Free structures */
if (p_pat_decoder->p_building_pat)
free(p_pat_decoder->p_building_pat);
dvbpsi_DeletePAT(p_pat_decoder->p_building_pat);
}
p_pat_decoder->p_building_pat = NULL;
......
......@@ -92,12 +92,15 @@ void dvbpsi_DetachPMT(dvbpsi_t *p_dvbpsi)
dvbpsi_pmt_decoder_t* p_pmt_decoder;
p_pmt_decoder = (dvbpsi_pmt_decoder_t*)p_dvbpsi->p_private;
free(p_pmt_decoder->p_building_pmt);
if (p_pmt_decoder->p_building_pmt)
dvbpsi_DeletePMT(p_pmt_decoder->p_building_pmt);
p_pmt_decoder->p_building_pmt = NULL;
for (unsigned int i = 0; i <= 255; i++)
{
if (p_pmt_decoder->ap_sections[i])
free(p_pmt_decoder->ap_sections[i]);
dvbpsi_DeletePSISections(p_pmt_decoder->ap_sections[i]);
p_pmt_decoder->ap_sections[i] = NULL;
}
dvbpsi_DeleteDecoder((dvbpsi_decoder_t *)p_dvbpsi->p_private);
......@@ -265,7 +268,7 @@ static void dvbpsi_ReInitPMT(dvbpsi_pmt_decoder_t* p_decoder, const bool b_force
/* Free structures */
if (p_decoder->p_building_pmt)
free(p_decoder->p_building_pmt);
dvbpsi_DeletePMT(p_decoder->p_building_pmt);
}
p_decoder->p_building_pmt = NULL;
......
......@@ -128,7 +128,9 @@ void dvbpsi_DetachSDT(dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_extensi
dvbpsi_sdt_decoder_t* p_sdt_decoder;
p_sdt_decoder = (dvbpsi_sdt_decoder_t*)p_subdec->p_decoder;
free(p_sdt_decoder->p_building_sdt);
if (p_sdt_decoder->p_building_sdt)
dvbpsi_DeleteSDT(p_sdt_decoder->p_building_sdt);
p_sdt_decoder->p_building_sdt = NULL;
for (unsigned int i = 0; i <= 255; i++)
{
......@@ -283,7 +285,7 @@ static void dvbpsi_ReInitSDT(dvbpsi_sdt_decoder_t* p_decoder, const bool b_force
/* Free structures */
if (p_decoder->p_building_sdt)
free(p_decoder->p_building_sdt);
dvbpsi_DeleteSDT(p_decoder->p_building_sdt);
}
p_decoder->p_building_sdt = NULL;
......@@ -298,13 +300,12 @@ static void dvbpsi_ReInitSDT(dvbpsi_sdt_decoder_t* p_decoder, const bool b_force
}
}
static bool dvbpsi_CheckSDT(dvbpsi_t *p_dvbpsi, dvbpsi_psi_section_t *p_section)
static bool dvbpsi_CheckSDT(dvbpsi_t *p_dvbpsi, dvbpsi_sdt_decoder_t *p_sdt_decoder,
dvbpsi_psi_section_t *p_section)
{
bool b_reinit = false;
assert(p_dvbpsi->p_private);
dvbpsi_sdt_decoder_t* p_sdt_decoder;
p_sdt_decoder = (dvbpsi_sdt_decoder_t *)p_dvbpsi->p_private;
assert(p_dvbpsi);
assert(p_sdt_decoder);
if (p_sdt_decoder->p_building_sdt->i_ts_id != p_section->i_extension)
{
......@@ -416,7 +417,7 @@ void dvbpsi_GatherSDTSections(dvbpsi_t *p_dvbpsi,
/* Perform a few sanity checks */
if (p_sdt_decoder->p_building_sdt)
{
if (dvbpsi_CheckSDT(p_dvbpsi, p_section))
if (dvbpsi_CheckSDT(p_dvbpsi, p_sdt_decoder, p_section))
dvbpsi_ReInitSDT(p_sdt_decoder, true);
}
else
......@@ -426,6 +427,9 @@ void dvbpsi_GatherSDTSections(dvbpsi_t *p_dvbpsi,
&& (p_sdt_decoder->current_sdt.b_current_next == p_section->b_current_next))
{
/* Don't decode since this version is already decoded */
dvbpsi_debug(p_dvbpsi, "SDT decoder",
"ignoring already decoded section %d",
p_section->i_number);
dvbpsi_DeletePSISections(p_section);
return;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment