From 45033a900fb0d004b9790f7b9d57045ea7510cd3 Mon Sep 17 00:00:00 2001
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date: Mon, 10 Mar 2014 19:49:22 +0100
Subject: Read errno before media_dbg calls

The media_dbg() in error paths can modify the errno value, leading to
the wrong error (or no error at all) being returned. Fix this by reading
the errno value before calling media_dbg().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/mediactl.c   | 6 ++++--
 src/v4l2subdev.c | 3 ++-
 2 files changed, 6 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/mediactl.c b/src/mediactl.c
index 57cf86b..7b18ca7 100644
--- a/src/mediactl.c
+++ b/src/mediactl.c
@@ -140,9 +140,10 @@ int media_setup_link(struct media_device *media,
 
 	ret = ioctl(media->fd, MEDIA_IOC_SETUP_LINK, &ulink);
 	if (ret == -1) {
+		ret = -errno;
 		media_dbg(media, "%s: Unable to setup link (%s)\n",
 			  __func__, strerror(errno));
-		return -errno;
+		return ret;
 	}
 
 	link->flags = ulink.flags;
@@ -211,12 +212,13 @@ static int media_enum_links(struct media_device *media)
 		links.links = calloc(entity->info.links, sizeof(struct media_link_desc));
 
 		if (ioctl(media->fd, MEDIA_IOC_ENUM_LINKS, &links) < 0) {
+			ret = -errno;
 			media_dbg(media,
 				  "%s: Unable to enumerate pads and links (%s).\n",
 				  __func__, strerror(errno));
 			free(links.pads);
 			free(links.links);
-			return -errno;
+			return ret;
 		}
 
 		for (i = 0; i < entity->info.pads; ++i) {
diff --git a/src/v4l2subdev.c b/src/v4l2subdev.c
index 2d45d7f..efc6708 100644
--- a/src/v4l2subdev.c
+++ b/src/v4l2subdev.c
@@ -45,10 +45,11 @@ int v4l2_subdev_open(struct media_entity *entity)
 
 	entity->fd = open(entity->devname, O_RDWR);
 	if (entity->fd == -1) {
+		int ret = -errno;
 		media_dbg(entity->media,
 			  "%s: Failed to open subdev device node %s\n", __func__,
 			  entity->devname);
-		return -errno;
+		return ret;
 	}
 
 	return 0;
-- 
cgit v1.2.3