Read errno before media_dbg calls
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 10 Mar 2014 18:49:22 +0000 (19:49 +0100)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 10 Mar 2014 18:53:54 +0000 (19:53 +0100)
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
src/v4l2subdev.c

index 57cf86b..7b18ca7 100644 (file)
@@ -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) {
index 2d45d7f..efc6708 100644 (file)
@@ -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;