Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10ee2402 authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB: gspca_main: some input error handling fixes



2 small changes to input device error handling:
1) Make it fatal when we fail to create an input device (it is either this
   or add checks for gspca_dev->input_dev being NULL in a lot of places)
2) Since we allow gspca_input_create_urb() to fail everywhere we call it,
   and thus never check its return value, make it void.

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent ac82f59f
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -184,8 +184,7 @@ static int gspca_input_connect(struct gspca_dev *dev)
		} else {
			dev->input_dev = input_dev;
		}
	} else
		err = -EINVAL;
	}

	return err;
}
@@ -243,9 +242,8 @@ static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev,
	return ret;
}

static int gspca_input_create_urb(struct gspca_dev *gspca_dev)
static void gspca_input_create_urb(struct gspca_dev *gspca_dev)
{
	int ret = -EINVAL;
	struct usb_interface *intf;
	struct usb_host_interface *intf_desc;
	struct usb_endpoint_descriptor *ep;
@@ -259,12 +257,11 @@ static int gspca_input_create_urb(struct gspca_dev *gspca_dev)
			if (usb_endpoint_dir_in(ep) &&
			    usb_endpoint_xfer_int(ep)) {

				ret = alloc_and_submit_int_urb(gspca_dev, ep);
				alloc_and_submit_int_urb(gspca_dev, ep);
				break;
			}
		}
	}
	return ret;
}

static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev)
@@ -2289,6 +2286,10 @@ int gspca_dev_probe(struct usb_interface *intf,
		goto out;
	gspca_set_default_mode(gspca_dev);

	ret = gspca_input_connect(gspca_dev);
	if (ret)
		goto out;

	mutex_init(&gspca_dev->usb_lock);
	mutex_init(&gspca_dev->read_lock);
	mutex_init(&gspca_dev->queue_lock);
@@ -2310,12 +2311,12 @@ int gspca_dev_probe(struct usb_interface *intf,
	usb_set_intfdata(intf, gspca_dev);
	PDEBUG(D_PROBE, "%s created", video_device_node_name(&gspca_dev->vdev));

	ret = gspca_input_connect(gspca_dev);
	if (ret == 0)
		ret = gspca_input_create_urb(gspca_dev);
	gspca_input_create_urb(gspca_dev);

	return 0;
out:
	if (gspca_dev->input_dev)
		input_unregister_device(gspca_dev->input_dev);
	kfree(gspca_dev->usb_buf);
	kfree(gspca_dev);
	return ret;