diff mbox

uvcvideo: Fix crash when linking entities

Message ID 1315348148-7207-1-git-send-email-laurent.pinchart@ideasonboard.com (mailing list archive)
State New, archived
Headers show

Commit Message

Laurent Pinchart Sept. 6, 2011, 10:29 p.m. UTC
The uvc_mc_register_entity() function wrongfully selects the
media_entity associated with a UVC entity when creating links. This
results in access to uninitialized media_entity structures and can hit a
BUG_ON statement in media_entity_create_link(). Fix it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/media/video/uvc/uvc_entity.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

This patch should fix a v3.0 regression that results in a kernel crash as
reported in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=637740 and
https://bugzilla.redhat.com/show_bug.cgi?id=735437.

Test results will be welcome.

Comments

Josh Boyer Sept. 7, 2011, 3:32 p.m. UTC | #1
On Wed, Sep 07, 2011 at 12:29:08AM +0200, Laurent Pinchart wrote:
> The uvc_mc_register_entity() function wrongfully selects the
> media_entity associated with a UVC entity when creating links. This
> results in access to uninitialized media_entity structures and can hit a
> BUG_ON statement in media_entity_create_link(). Fix it.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  drivers/media/video/uvc/uvc_entity.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> This patch should fix a v3.0 regression that results in a kernel crash as
> reported in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=637740 and
> https://bugzilla.redhat.com/show_bug.cgi?id=735437.
> 
> Test results will be welcome.

I built a test kernel for Fedora with the patch and the submitter of the
above bug has reported that the issue seems to be fixed.

josh

> diff --git a/drivers/media/video/uvc/uvc_entity.c b/drivers/media/video/uvc/uvc_entity.c
> index 48fea37..29e2399 100644
> --- a/drivers/media/video/uvc/uvc_entity.c
> +++ b/drivers/media/video/uvc/uvc_entity.c
> @@ -49,7 +49,7 @@ static int uvc_mc_register_entity(struct uvc_video_chain *chain,
>  		if (remote == NULL)
>  			return -EINVAL;
>  
> -		source = (UVC_ENTITY_TYPE(remote) != UVC_TT_STREAMING)
> +		source = (UVC_ENTITY_TYPE(remote) == UVC_TT_STREAMING)
>  		       ? (remote->vdev ? &remote->vdev->entity : NULL)
>  		       : &remote->subdev.entity;
>  		if (source == NULL)
> -- 
> Regards,
> 
> Laurent Pinchart
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Laurent Pinchart Sept. 8, 2011, 7:38 a.m. UTC | #2
Hi Josh,

On Wednesday 07 September 2011 17:32:41 Josh Boyer wrote:
> On Wed, Sep 07, 2011 at 12:29:08AM +0200, Laurent Pinchart wrote:
> > The uvc_mc_register_entity() function wrongfully selects the
> > media_entity associated with a UVC entity when creating links. This
> > results in access to uninitialized media_entity structures and can hit a
> > BUG_ON statement in media_entity_create_link(). Fix it.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> > 
> >  drivers/media/video/uvc/uvc_entity.c |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> > 
> > This patch should fix a v3.0 regression that results in a kernel crash as
> > reported in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=637740 and
> > https://bugzilla.redhat.com/show_bug.cgi?id=735437.
> > 
> > Test results will be welcome.
> 
> I built a test kernel for Fedora with the patch and the submitter of the
> above bug has reported that the issue seems to be fixed.

Thank you. I will push the patch upstream.
diff mbox

Patch

diff --git a/drivers/media/video/uvc/uvc_entity.c b/drivers/media/video/uvc/uvc_entity.c
index 48fea37..29e2399 100644
--- a/drivers/media/video/uvc/uvc_entity.c
+++ b/drivers/media/video/uvc/uvc_entity.c
@@ -49,7 +49,7 @@  static int uvc_mc_register_entity(struct uvc_video_chain *chain,
 		if (remote == NULL)
 			return -EINVAL;
 
-		source = (UVC_ENTITY_TYPE(remote) != UVC_TT_STREAMING)
+		source = (UVC_ENTITY_TYPE(remote) == UVC_TT_STREAMING)
 		       ? (remote->vdev ? &remote->vdev->entity : NULL)
 		       : &remote->subdev.entity;
 		if (source == NULL)