Blob Blame History Raw
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: 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>

diff --git a/lib/libdvbv5/dvb-dev-local.c b/lib/libdvbv5/dvb-dev-local.c
index 2de9a61..e98b967 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 7f63476..5dcf492 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;
-- 
cgit v0.10.2