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

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

V4L/DVB (8362): gspca: Bad offset of the brightness sum in sn9c103 packets.

parent b7474cf9
Loading
Loading
Loading
Loading
+19 −7
Original line number Original line Diff line number Diff line
@@ -1033,6 +1033,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
	int i;
	int i;
	struct sd *sd = (struct sd *) gspca_dev;
	struct sd *sd = (struct sd *) gspca_dev;


	/* frames start with:
	 *	ff ff 00 c4 c4 96	synchro
	 *	00		(unknown)
	 *	xx		(frame sequence / size / compression)
	 *	(xx)		(idem - extra byte for sn9c103)
	 *	ll mm		brightness sum inside auto exposure
	 *	ll mm		brightness sum outside auto exposure
	 *	(xx xx xx xx xx)	audio values for snc103
	 */
	if (len > 6 && len < 24) {
	if (len > 6 && len < 24) {
		for (i = 0; i < len - 6; i++) {
		for (i = 0; i < len - 6; i++) {
			if (data[0 + i] == 0xff
			if (data[0 + i] == 0xff
@@ -1043,15 +1052,18 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
			    && data[5 + i] == 0x96) {	/* start of frame */
			    && data[5 + i] == 0x96) {	/* start of frame */
				frame = gspca_frame_add(gspca_dev, LAST_PACKET,
				frame = gspca_frame_add(gspca_dev, LAST_PACKET,
							frame, data, 0);
							frame, data, 0);
				if (i < (len - 10)) {
				if (len - i < sd->fr_h_sz) {
					atomic_set(&sd->avg_lum, data[i + 8] +
							(data[i + 9] << 8));
				} else {
					atomic_set(&sd->avg_lum, -1);
					atomic_set(&sd->avg_lum, -1);
#ifdef CONFIG_VIDEO_ADV_DEBUG
					PDEBUG(D_STREAM, "packet too short to"
					PDEBUG(D_STREAM, "packet too short to"
						" get avg brightness");
						" get avg brightness");
#endif
				} else if (sd->fr_h_sz == 12) {
					atomic_set(&sd->avg_lum,
						data[i + 8] +
							(data[i + 9] << 8));
				} else {
					atomic_set(&sd->avg_lum,
						data[i + 9] +
							(data[i + 10] << 8));
				}
				}
				data += i + sd->fr_h_sz;
				data += i + sd->fr_h_sz;
				len -= i + sd->fr_h_sz;
				len -= i + sd->fr_h_sz;