]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
media: video/hdmi: handle short reads of hdmi info frame.
authorTom Rix <trix@redhat.com>
Thu, 12 Aug 2021 17:01:46 +0000 (19:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:40:07 +0000 (14:40 +0200)
[ Upstream commit 4a92fc6e55da5b87cecb572275deaff6ac9dd27e ]

Calling hdmi_infoframe_unpack() with static sizeof(buffer) skips all
the size checking done later in hdmi_infoframe_unpack().  A better
value is the amount of data read into buffer.

Fixes: 480b8b3e42c3 ("video/hdmi: Pass buffer size to infoframe unpack functions")
Signed-off-by: Tom Rix <trix@redhat.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/i2c/adv7511-v4l2.c
drivers/media/i2c/adv7604.c
drivers/media/i2c/adv7842.c

index ab7883cff8b2236064f6d8870d398f8eabc1407f..9f5713b76794d686c17bff3b7d0a3dedc7d10505 100644 (file)
@@ -555,7 +555,7 @@ static void log_infoframe(struct v4l2_subdev *sd, const struct adv7511_cfg_read_
        buffer[3] = 0;
        buffer[3] = hdmi_infoframe_checksum(buffer, len + 4);
 
-       if (hdmi_infoframe_unpack(&frame, buffer, sizeof(buffer)) < 0) {
+       if (hdmi_infoframe_unpack(&frame, buffer, len + 4) < 0) {
                v4l2_err(sd, "%s: unpack of %s infoframe failed\n", __func__, cri->desc);
                return;
        }
index d1f58795794fd0a2c2278c1692cdfc7ed01e5f81..8cf1704308bf5aaef736debb1a45dad5d930445a 100644 (file)
@@ -2454,7 +2454,7 @@ static int adv76xx_read_infoframe(struct v4l2_subdev *sd, int index,
                buffer[i + 3] = infoframe_read(sd,
                                       adv76xx_cri[index].payload_addr + i);
 
-       if (hdmi_infoframe_unpack(frame, buffer, sizeof(buffer)) < 0) {
+       if (hdmi_infoframe_unpack(frame, buffer, len + 3) < 0) {
                v4l2_err(sd, "%s: unpack of %s infoframe failed\n", __func__,
                         adv76xx_cri[index].desc);
                return -ENOENT;
index f7d2b6cd3008b3e4e9bf0e46de05b581cd779aea..a870117feb44c550b65c02c8b7b4b1d8e5afeb2b 100644 (file)
@@ -2574,7 +2574,7 @@ static void log_infoframe(struct v4l2_subdev *sd, const struct adv7842_cfg_read_
        for (i = 0; i < len; i++)
                buffer[i + 3] = infoframe_read(sd, cri->payload_addr + i);
 
-       if (hdmi_infoframe_unpack(&frame, buffer, sizeof(buffer)) < 0) {
+       if (hdmi_infoframe_unpack(&frame, buffer, len + 3) < 0) {
                v4l2_err(sd, "%s: unpack of %s infoframe failed\n", __func__, cri->desc);
                return;
        }