summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeonghee Kim <jhhhh.kim@samsung.com>2023-07-26 10:17:45 +0900
committerTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2023-07-27 08:22:24 +0000
commit4c474438ed651141d040583a3748d20ef01e9122 (patch)
treeabfd831361e863a9b77d07bf42ae4f115c4a92da
parent846bd39ccf6c1e8f8d579224ec70c0233c1d3252 (diff)
downloadgs-4c474438ed651141d040583a3748d20ef01e9122.tar.gz
media: mfc: prevent the consumed size from becoming negative
BUG: 292442146 Change-Id: I1d653635a86f41462397770f4778d06576684591 Signed-off-by: Jeonghee Kim <jhhhh.kim@samsung.com>
-rw-r--r--drivers/media/platform/exynos/mfc/mfc_core_nal_q.c1
-rw-r--r--drivers/media/platform/exynos/mfc/mfc_queue.c8
-rw-r--r--drivers/media/platform/exynos/mfc/mfc_utils.h20
3 files changed, 23 insertions, 6 deletions
diff --git a/drivers/media/platform/exynos/mfc/mfc_core_nal_q.c b/drivers/media/platform/exynos/mfc/mfc_core_nal_q.c
index 87e35b55c..28eef5f7c 100644
--- a/drivers/media/platform/exynos/mfc/mfc_core_nal_q.c
+++ b/drivers/media/platform/exynos/mfc/mfc_core_nal_q.c
@@ -2245,6 +2245,7 @@ static void __mfc_core_nal_q_handle_frame_input(struct mfc_core *core, struct mf
src_mb = mfc_get_del_buf(ctx, &ctx->src_buf_nal_queue, MFC_BUF_NO_TOUCH_USED);
if (src_mb)
vb2_buffer_done(&src_mb->vb.vb2_buf, VB2_BUF_STATE_DONE);
+ dec->consumed = 0;
}
/* Check multi-frame */
diff --git a/drivers/media/platform/exynos/mfc/mfc_queue.c b/drivers/media/platform/exynos/mfc/mfc_queue.c
index 9a0592a26..32ae2e434 100644
--- a/drivers/media/platform/exynos/mfc/mfc_queue.c
+++ b/drivers/media/platform/exynos/mfc/mfc_queue.c
@@ -137,9 +137,11 @@ struct mfc_buf *mfc_get_del_if_consumed(struct mfc_ctx *ctx, struct mfc_buf_queu
mfc_debug(2, "addr[0]: 0x%08llx\n", mfc_buf->addr[0][0]);
- strm_size = mfc_dec_get_strm_size(ctx, mfc_buf),
- remained = strm_size - consumed;
- if (consumed > strm_size) {
+ strm_size = mfc_dec_get_strm_size(ctx, mfc_buf);
+ if (strm_size >= consumed) {
+ remained = strm_size - consumed;
+ } else {
+ remained = 0;
exceed = true;
mfc_ctx_err("[MULTIFRAME] consumed (%d) exceeded the strm_size (%d)\n",
consumed, strm_size);
diff --git a/drivers/media/platform/exynos/mfc/mfc_utils.h b/drivers/media/platform/exynos/mfc/mfc_utils.h
index 2c48e5c18..9a04486d3 100644
--- a/drivers/media/platform/exynos/mfc/mfc_utils.h
+++ b/drivers/media/platform/exynos/mfc/mfc_utils.h
@@ -199,9 +199,23 @@ static inline u32 mfc_dec_get_strm_size(struct mfc_ctx *ctx, struct mfc_buf *src
* And the dec->consumed is cumulate-decoded size.
*/
vb_plane = &src_mb->vb.vb2_buf.planes[0];
- strm_size = vb_plane->bytesused - vb_plane->data_offset;
- if (dec->consumed)
- strm_size -= dec->consumed;
+ if (vb_plane->bytesused > vb_plane->data_offset) {
+ strm_size = vb_plane->bytesused - vb_plane->data_offset;
+ } else {
+ strm_size = vb_plane->bytesused;
+ mfc_ctx_err("[STREAM] invalid offset (bytesused %d, data_offset: %d)\n",
+ vb_plane->bytesused, vb_plane->data_offset);
+ }
+
+ if (dec->consumed) {
+ if (strm_size > dec->consumed) {
+ strm_size -= dec->consumed;
+ } else {
+ dec->consumed = 0;
+ mfc_ctx_err("[STREAM] invalid consumed (strm_size: %d, consumed: %d)",
+ strm_size, dec->consumed);
+ }
+ }
mfc_debug(2, "[STREAM] strm_size: %d (bytesused %d, data_offset %d, consumed %d)\n",
strm_size, vb_plane->bytesused, vb_plane->data_offset, dec->consumed);