diff options
author | Jean-François Moine <moinejf@free.fr> | 2010-07-29 01:46:02 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-08-08 22:43:01 -0400 |
commit | fe988f56c7c1bff52a4c26164ceb3dbd582de433 (patch) | |
tree | 175a6f05a609ab852a257457bf41912be7ca9105 /drivers | |
parent | 5fd8f7388c9a8601c2dbe0da458df602fe427e83 (diff) |
V4L/DVB: gspca - main: Fix a crash in gspca_frame_add()
Some webcams as ov511 may find many times an end of image.
In this case, with the last patch in image concatenation
(commit 799b1bd41f398054d46fd35f73abd01c4009f6ca),
the image pointer was NULL and the system crashed in memcpy().
Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/gspca/gspca.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index 0004469691cc..b9846106913e 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -440,10 +440,15 @@ void gspca_frame_add(struct gspca_dev *gspca_dev, | |||
440 | frame->v4l2_buf.sequence = ++gspca_dev->sequence; | 440 | frame->v4l2_buf.sequence = ++gspca_dev->sequence; |
441 | gspca_dev->image = frame->data; | 441 | gspca_dev->image = frame->data; |
442 | gspca_dev->image_len = 0; | 442 | gspca_dev->image_len = 0; |
443 | } else if (gspca_dev->last_packet_type == DISCARD_PACKET) { | 443 | } else { |
444 | if (packet_type == LAST_PACKET) | 444 | switch (gspca_dev->last_packet_type) { |
445 | gspca_dev->last_packet_type = packet_type; | 445 | case DISCARD_PACKET: |
446 | return; | 446 | if (packet_type == LAST_PACKET) |
447 | gspca_dev->last_packet_type = packet_type; | ||
448 | return; | ||
449 | case LAST_PACKET: | ||
450 | return; | ||
451 | } | ||
447 | } | 452 | } |
448 | 453 | ||
449 | /* append the packet to the frame buffer */ | 454 | /* append the packet to the frame buffer */ |
@@ -454,6 +459,12 @@ void gspca_frame_add(struct gspca_dev *gspca_dev, | |||
454 | gspca_dev->frsz); | 459 | gspca_dev->frsz); |
455 | packet_type = DISCARD_PACKET; | 460 | packet_type = DISCARD_PACKET; |
456 | } else { | 461 | } else { |
462 | /* !! image is NULL only when last pkt is LAST or DISCARD | ||
463 | if (gspca_dev->image == NULL) { | ||
464 | err("gspca_frame_add() image == NULL"); | ||
465 | return; | ||
466 | } | ||
467 | */ | ||
457 | memcpy(gspca_dev->image + gspca_dev->image_len, | 468 | memcpy(gspca_dev->image + gspca_dev->image_len, |
458 | data, len); | 469 | data, len); |
459 | gspca_dev->image_len += len; | 470 | gspca_dev->image_len += len; |