Fixes #1126 - correct reference handling issue in XMLTV grabber (and possibly PyEPG) that could result in ptr being held to free()d memory.

This commit is contained in:
Adam Sutton 2012-08-17 15:16:41 +01:00
parent 79bbe2e44d
commit 3f1b5474f1
2 changed files with 52 additions and 53 deletions

View file

@ -309,9 +309,6 @@ static int _pyepg_parse_broadcast
if ((stop = htsmsg_get_str(attr, "stop")) == NULL ) return 0;
if ((tags = htsmsg_get_map(data, "tags")) == NULL) return 0;
/* Find episode */
if ((episode = epg_episode_find_by_uri(id, 1, &save)) == NULL) return 0;
/* Parse times */
if (!_pyepg_parse_time(start, &tm_start)) return 0;
if (!_pyepg_parse_time(stop, &tm_stop)) return 0;
@ -323,9 +320,6 @@ static int _pyepg_parse_broadcast
stats->broadcasts.total++;
if ( save ) stats->broadcasts.created++;
/* Set episode */
save |= epg_broadcast_set_episode(broadcast, episode, mod);
/* Quality */
u32 = htsmsg_get_map(tags, "hd") ? 1 : 0;
save |= epg_broadcast_set_is_hd(broadcast, u32, mod);
@ -343,6 +337,10 @@ static int _pyepg_parse_broadcast
u32 = htsmsg_get_map(tags, "repeat") ? 1 : 0;
save |= epg_broadcast_set_is_repeat(broadcast, u32, mod);
/* Set episode */
if ((episode = epg_episode_find_by_uri(id, 1, &save)) == NULL) return 0;
save |= epg_broadcast_set_episode(broadcast, episode, mod);
if (save) stats->broadcasts.modified++;
return save;

View file

@ -344,6 +344,29 @@ static int _xmltv_parse_programme_tags
/* Ignore */
if (!title) return 0;
/*
* Broadcast
*/
/* Create/Find broadcast */
if (!(ebc = epg_broadcast_find_by_time(ch, start, stop, 0, 1, &save2))) return 0;
stats->broadcasts.total++;
if (save2) stats->broadcasts.created++;
/* Quality metadata */
save2 |= parse_vid_quality(mod, ebc, ee, htsmsg_get_map(tags, "video"));
/* Accessibility */
save2 |= xmltv_parse_accessibility(mod, ebc, tags);
/* Misc */
if (htsmsg_get_map(tags, "previously-shown"))
save |= epg_broadcast_set_is_repeat(ebc, 1, mod);
else if (htsmsg_get_map(tags, "premiere") ||
htsmsg_get_map(tags, "new"))
save |= epg_broadcast_set_is_new(ebc, 1, mod);
/* Get episode info */
get_episode_info(mod, tags, &uri, &suri, &onscreen,
&sn, &sc, &en, &ec, &pn, &pc);
@ -360,62 +383,40 @@ static int _xmltv_parse_programme_tags
/*
* Episode
*/
if (!uri) uri = epg_hash(title, NULL, desc);
if (!uri)
uri = epg_hash(title, NULL, desc);
if (uri) {
ee = epg_episode_find_by_uri(uri, 1, &save);
free(uri);
}
if (!ee) return 0;
stats->episodes.total++;
if (save) stats->episodes.created++;
if (ee) {
stats->episodes.total++;
if (save) stats->episodes.created++;
if (es)
save |= epg_episode_set_season(ee, es, mod);
if (title)
save |= epg_episode_set_title(ee, title, mod);
if (desc)
save |= epg_episode_set_description(ee, desc, mod);
if ((egl = _xmltv_parse_categories(tags))) {
save |= epg_episode_set_genre(ee, egl, mod);
epg_genre_list_destroy(egl);
}
if (pn) save |= epg_episode_set_part(ee, pn, pc, mod);
if (en) save |= epg_episode_set_number(ee, en, mod);
if (save) stats->episodes.modified++;
/*
* Broadcast
*/
// TODO: need to handle certification and ratings
// TODO: need to handle season numbering!
// TODO: need to handle onscreen numbering
//if (onscreen) save |= epg_episode_set_onscreen(ee, onscreen);
/* Create/Find broadcast */
ebc = epg_broadcast_find_by_time(ch, start, stop, 0, 1, &save2);
if ( ebc ) {
stats->broadcasts.total++;
if (save2) stats->broadcasts.created++;
save2 |= epg_broadcast_set_episode(ebc, ee, mod);
/* Quality metadata */
save2 |= parse_vid_quality(mod, ebc, ee, htsmsg_get_map(tags, "video"));
if (es)
save |= epg_episode_set_season(ee, es, mod);
if (title)
save |= epg_episode_set_title(ee, title, mod);
if (desc)
save |= epg_episode_set_description(ee, desc, mod);
if ((egl = _xmltv_parse_categories(tags))) {
save |= epg_episode_set_genre(ee, egl, mod);
epg_genre_list_destroy(egl);
}
if (pn) save |= epg_episode_set_part(ee, pn, pc, mod);
if (en) save |= epg_episode_set_number(ee, en, mod);
if (save) stats->episodes.modified++;
/* Accessibility */
save2 |= xmltv_parse_accessibility(mod, ebc, tags);
/* Misc */
if (htsmsg_get_map(tags, "previously-shown"))
save |= epg_broadcast_set_is_repeat(ebc, 1, mod);
else if (htsmsg_get_map(tags, "premiere") ||
htsmsg_get_map(tags, "new"))
save |= epg_broadcast_set_is_new(ebc, 1, mod);
/* Stats */
if (save2) stats->broadcasts.modified++;
// TODO: need to handle certification and ratings
// TODO: need to handle season numbering!
// TODO: need to handle onscreen numbering
}
/* Stats */
if (save2) stats->broadcasts.modified++;
return save | save2 | save3;
}