From 41f19db34e17ed13f5cc06d9147ba83803224ce6 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> Date: Fri, 26 Apr 2019 12:05:57 -0300 Subject: [PATCH] Revert "libdvbv5: leaks and double free in dvb_fe_open_fname()" This reverts commit c82608ca1595427c2bdbd4abb9aca9163e1df60a. This patch is buggy, as reported at: https://bugs.kde.org/show_bug.cgi?id=406145 https://bugzilla.redhat.com/show_bug.cgi?id=1695023 So, revert it, in order to make Kaffeine work again. Thanks to Wolfgang Ulbrich with detected the bad patch and checked that reverting it fixes the issue. Fix tested with a PCTV 461 and a DVB-S2 stream from my TV provider. Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> --- lib/libdvbv5/dvb-dev-local.c | 2 +- lib/libdvbv5/dvb-fe.c | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/libdvbv5/dvb-dev-local.c b/lib/libdvbv5/dvb-dev-local.c index 2de9a6147..e98b967a3 100644 --- a/lib/libdvbv5/dvb-dev-local.c +++ b/lib/libdvbv5/dvb-dev-local.c @@ -467,7 +467,7 @@ static struct dvb_open_descriptor flags &= ~O_NONBLOCK; } - ret = dvb_fe_open_fname(parms, dev->path, flags); + ret = dvb_fe_open_fname(parms, strdup(dev->path), flags); if (ret) { free(open_dev); return NULL; diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c index 7f6347661..5dcf492ef 100644 --- a/lib/libdvbv5/dvb-fe.c +++ b/lib/libdvbv5/dvb-fe.c @@ -133,6 +133,7 @@ struct dvb_v5_fe_parms *dvb_fe_open_flags(int adapter, int frontend, int flags) { int ret; + char *fname; struct dvb_device *dvb; struct dvb_dev_list *dvb_dev; struct dvb_v5_fe_parms_priv *parms = NULL; @@ -152,6 +153,7 @@ struct dvb_v5_fe_parms *dvb_fe_open_flags(int adapter, int frontend, dvb_dev_free(dvb); return NULL; } + fname = strdup(dvb_dev->path); if (!strcmp(dvb_dev->bus_addr, "platform:dvbloopback")) { logfunc(LOG_WARNING, _("Detected dvbloopback")); @@ -159,10 +161,14 @@ struct dvb_v5_fe_parms *dvb_fe_open_flags(int adapter, int frontend, } dvb_dev_free(dvb); - + if (!fname) { + logfunc(LOG_ERR, _("fname calloc: %s"), strerror(errno)); + return NULL; + } parms = calloc(sizeof(*parms), 1); if (!parms) { logfunc(LOG_ERR, _("parms calloc: %s"), strerror(errno)); + free(fname); return NULL; } parms->p.verbose = verbose; @@ -177,7 +183,7 @@ struct dvb_v5_fe_parms *dvb_fe_open_flags(int adapter, int frontend, if (use_legacy_call) parms->p.legacy_fe = 1; - ret = dvb_fe_open_fname(parms, dvb_dev->path, flags); + ret = dvb_fe_open_fname(parms, fname, flags); if (ret < 0) { dvb_v5_free(parms); return NULL; @@ -197,6 +203,7 @@ int dvb_fe_open_fname(struct dvb_v5_fe_parms_priv *parms, char *fname, fd = open(fname, flags, 0); if (fd == -1) { dvb_logerr(_("%s while opening %s"), strerror(errno), fname); + free(fname); return -errno; } @@ -217,12 +224,7 @@ int dvb_fe_open_fname(struct dvb_v5_fe_parms_priv *parms, char *fname, } } - parms->fname = strdup(fname); - if (!parms->fname) { - dvb_logerr(_("fname calloc: %s"), strerror(errno)); - return -errno; - } - + parms->fname = fname; parms->fd = fd; parms->fe_flags = flags; parms->dvb_prop[0].cmd = DTV_API_VERSION; -- GitLab