Patch Detail
Show a patch.
GET /api/1.1/patches/22210/?format=api
{ "id": 22210, "url": "https://patchwork.libcamera.org/api/1.1/patches/22210/?format=api", "web_url": "https://patchwork.libcamera.org/patch/22210/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20241206112743.95435-1-stanislaw.gruszka@linux.intel.com>", "date": "2024-12-06T11:27:43", "name": "[RFC] delayed_controls: avoid reading undefined control value", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "7368cb19d7c531c40353ddd35e5ef9c4400a4562", "submitter": { "id": 211, "url": "https://patchwork.libcamera.org/api/1.1/people/211/?format=api", "name": "Stanislaw Gruszka", "email": "stanislaw.gruszka@linux.intel.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/22210/mbox/", "series": [ { "id": 4855, "url": "https://patchwork.libcamera.org/api/1.1/series/4855/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4855", "date": "2024-12-06T11:27:43", "name": "[RFC] delayed_controls: avoid reading undefined control value", "version": 1, "mbox": "https://patchwork.libcamera.org/series/4855/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/22210/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/22210/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id B684CBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 6 Dec 2024 11:27:56 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EC154618B3;\n\tFri, 6 Dec 2024 12:27:55 +0100 (CET)", "from mgamail.intel.com (mgamail.intel.com [198.175.65.21])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 79C39618B3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 6 Dec 2024 12:27:53 +0100 (CET)", "from fmviesa001.fm.intel.com ([10.60.135.141])\n\tby orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n\t06 Dec 2024 03:27:51 -0800", "from sgruszka-mobl.ger.corp.intel.com (HELO localhost)\n\t([10.245.85.43])\n\tby smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n\t06 Dec 2024 03:27:50 -0800" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=intel.com header.i=@intel.com\n\theader.b=\"ejVhYtDk\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n\td=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n\tt=1733484474; x=1765020474;\n\th=from:to:cc:subject:date:message-id:mime-version:\n\tcontent-transfer-encoding;\n\tbh=Wffql4qqGjdjWvZyiPrfbQ/hqno93NstFihPL2ssJm0=;\n\tb=ejVhYtDkvxgsXEazwG8r2LWJzdP661+YaWpbCeY8XxbBDuqAeRuZIp+l\n\tiuVKTGx4iMqY6K+j+4WoBLrN8Xrg7fmy/REPcozheN8uwnJtUjaUf8Xux\n\t01ItfAvx5EJgb7OzDY+5MgDNh/xRuGcaWgYh7x33PmFKpsFJOkp2yiWxp\n\tkhs4YAHxM23KVbOu0v8e5l6dv8n2XhHaTQFCCjUbmVxxSKoFsXQO97mpr\n\tFDydQrbzYi6B5Qzud8dUnkfOaG+AtkhHpXjjloXdDXwuRg9tFY5p7GCKo\n\thKd15sqCveifUWtI+oa+VTSgwqSisiKJ2Z433b0NBDe2zKzxs7SfG6Vbl w==;", "X-CSE-ConnectionGUID": [ "rgPI+y0gRBqwg9gh7ChKRw==", "hpHGRAAxQR+c+gZCWyyPuQ==" ], "X-CSE-MsgGUID": [ "2g0FX7BLQDmdO6+AQ+LDUA==", "y06yRQ9TSAutFZlrje5vlg==" ], "X-IronPort-AV": [ "E=McAfee;i=\"6700,10204,11277\"; a=\"33755252\"", "E=Sophos;i=\"6.12,213,1728975600\"; d=\"scan'208\";a=\"33755252\"", "E=Sophos;i=\"6.12,213,1728975600\"; d=\"scan'208\";a=\"125292742\"" ], "X-ExtLoop1": "1", "From": "Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Milan Zamazal <mzamazal@redhat.com>", "Subject": "[RFC] delayed_controls: avoid reading undefined control value", "Date": "Fri, 6 Dec 2024 12:27:43 +0100", "Message-Id": "<20241206112743.95435-1-stanislaw.gruszka@linux.intel.com>", "X-Mailer": "git-send-email 2.34.1", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Limit ControlRingBuffer index by number of queued entries in order do\navoid reading undefined control value with type ControlTypeNone .\n\nIt can happen at the begging of streaming when ControlRingBuffer is\nnot yet filled and there are errors on CSI-2 bus resulting dropping\nframes. Then we can call to DelayedControls::get() with frame number\nthat exceed number of saved entries and get below assertion failure:\n\n../src/libcamera/delayed_controls.cpp:227:\nlibcamera::ControlList libcamera::DelayedControls::get(uint32_t):\nAssertion `info.type() != ControlTypeNone' failed\n\nBug: https://bugs.libcamera.org/show_bug.cgi?id=241\nSigned-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>\n---\nNotes: When debugging this I notice that the push() and get() are\ndone in different threads. Maybe mutex should be\nused? Not sure how synchronization works for mojom signals\nhandlers.\n\nAlso I'm not sure if similar change like in this patch\nis not needed for rpi DelayedControls\n\nAlternative fix would be to pre-fill ControlRingBuffer with\nvalid control values. Should we care about possibility\nof queueCount_ overflowing ? \n\n src/libcamera/delayed_controls.cpp | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\n--\n2.43.0", "diff": "diff --git a/src/libcamera/delayed_controls.cpp b/src/libcamera/delayed_controls.cpp\nindex 94d0a575..78b0b8f7 100644\n--- a/src/libcamera/delayed_controls.cpp\n+++ b/src/libcamera/delayed_controls.cpp\n@@ -202,7 +202,7 @@ bool DelayedControls::push(const ControlList &controls)\n */\n ControlList DelayedControls::get(uint32_t sequence)\n {\n-\tunsigned int index = std::max<int>(0, sequence - maxDelay_);\n+\tunsigned int index = std::clamp<int>(sequence - maxDelay_, 0, queueCount_ - 1);\n\n \tControlList out(device_->controls());\n \tfor (const auto &ctrl : values_) {\n", "prefixes": [ "RFC" ] }