[{"id":15919,"web_url":"https://patchwork.libcamera.org/comment/15919/","msgid":"<YF1H673Y0M/bpuZU@pendragon.ideasonboard.com>","date":"2021-03-26T02:33:15","subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nThank you for the patch.\n\nOn Thu, Mar 25, 2021 at 01:42:27PM +0000, Kieran Bingham wrote:\n> The camera object has a state machine to ensure calls are only made\n> when in the correct state. It isn't easy to identify where things happen\n> when assertions fail so add extra information to make this clearer.\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  src/libcamera/camera.cpp | 51 +++++++++++++++++++++++-----------------\n>  1 file changed, 30 insertions(+), 21 deletions(-)\n> \n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index b86bff4745b2..336ab8695ab3 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -346,8 +346,9 @@ public:\n>  \t\tconst std::set<Stream *> &streams);\n>  \t~Private();\n>  \n> -\tint isAccessAllowed(State state, bool allowDisconnected = false) const;\n> -\tint isAccessAllowed(State low, State high,\n> +\tint isAccessAllowed(const char *from, State state,\n> +\t\t\t    bool allowDisconnected = false) const;\n> +\tint isAccessAllowed(const char *from, State low, State high,\n>  \t\t\t    bool allowDisconnected = false) const;\n\nIt's not very nice to have to pass the function name on every call :-S\nIs there any way we could improve this ?\n\nThe option that first came to my mind was macros, which isn't really\nnice either, and then I came across this really really nice trick:\n\n\tint isAccessAllowed(State state, bool allowDisconnected = false,\n\t\t\t    const char *from = __builtin_FUNCTION()) const;\n\tint isAccessAllowed(State low, State high,\n\t\t\t    bool allowDisconnected = false,\n\t\t\t    const char *from = __builtin_FUNCTION()) const;\n\n>  \n>  \tvoid disconnect();\n> @@ -384,7 +385,8 @@ static const char *const camera_state_names[] = {\n>  \t\"Running\",\n>  };\n>  \n> -int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const\n> +int Camera::Private::isAccessAllowed(const char *from, State state,\n> +\t\t\t\t     bool allowDisconnected) const\n>  {\n>  \tif (!allowDisconnected && disconnected_)\n>  \t\treturn -ENODEV;\n> @@ -395,14 +397,16 @@ int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const\n>  \n>  \tASSERT(static_cast<unsigned int>(state) < std::size(camera_state_names));\n>  \n> -\tLOG(Camera, Debug) << \"Camera in \" << camera_state_names[currentState]\n> -\t\t\t   << \" state trying operation requiring state \"\n> -\t\t\t   << camera_state_names[state];\n> +\tLOG(Camera, Warning) << \"Camera in \" << camera_state_names[currentState]\n\nFor operations coming from applications, should this really be a warning\n? I suppose it's good to warn them. Could you mention this change in the\ncommit message ?\n\n> +\t\t\t     << \" state trying operation [\"\n> +\t\t\t     << from << \"] requiring state \"\n> +\t\t\t     << camera_state_names[state];\n>  \n>  \treturn -EACCES;\n>  }\n>  \n> -int Camera::Private::isAccessAllowed(State low, State high,\n> +int Camera::Private::isAccessAllowed(const char *from,\n> +\t\t\t\t     State low, State high,\n>  \t\t\t\t     bool allowDisconnected) const\n>  {\n>  \tif (!allowDisconnected && disconnected_)\n> @@ -415,10 +419,11 @@ int Camera::Private::isAccessAllowed(State low, State high,\n>  \tASSERT(static_cast<unsigned int>(low) < std::size(camera_state_names) &&\n>  \t       static_cast<unsigned int>(high) < std::size(camera_state_names));\n>  \n> -\tLOG(Camera, Debug) << \"Camera in \" << camera_state_names[currentState]\n> -\t\t\t   << \" state trying operation requiring state between \"\n> -\t\t\t   << camera_state_names[low] << \" and \"\n> -\t\t\t   << camera_state_names[high];\n> +\tLOG(Camera, Warning) << \"Camera in \" << camera_state_names[currentState]\n> +\t\t\t     << \" state trying operation [\" << from\n> +\t\t\t     << \"] requiring state between \"\n> +\t\t\t     << camera_state_names[low] << \" and \"\n> +\t\t\t     << camera_state_names[high];\n>  \n>  \treturn -EACCES;\n>  }\n> @@ -646,7 +651,7 @@ int Camera::exportFrameBuffers(Stream *stream,\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraConfigured);\n> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured);\n\n__func__ is standard (since C99), __FUNCTION__ is gcc-specific. OK,\n__builtin_FUNCTION() is also gcc-specific :-) I've tested it with gcc 7\nto 10 and clang 7 to 11, it compiles on all of them.\n\nWith this change,\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \tif (ret < 0)\n>  \t\treturn ret;\n>  \n> @@ -693,7 +698,7 @@ int Camera::acquire()\n>  \t * No manual locking is required as PipelineHandler::lock() is\n>  \t * thread-safe.\n>  \t */\n> -\tint ret = d->isAccessAllowed(Private::CameraAvailable);\n> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraAvailable);\n>  \tif (ret < 0)\n>  \t\treturn ret == -EACCES ? -EBUSY : ret;\n>  \n> @@ -726,7 +731,8 @@ int Camera::release()\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraAvailable,\n> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> +\t\t\t\t     Private::CameraAvailable,\n>  \t\t\t\t     Private::CameraConfigured, true);\n>  \tif (ret < 0)\n>  \t\treturn ret == -EACCES ? -EBUSY : ret;\n> @@ -805,7 +811,8 @@ std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(const StreamR\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraAvailable,\n> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> +\t\t\t\t     Private::CameraAvailable,\n>  \t\t\t\t     Private::CameraRunning);\n>  \tif (ret < 0)\n>  \t\treturn nullptr;\n> @@ -866,7 +873,8 @@ int Camera::configure(CameraConfiguration *config)\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraAcquired,\n> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> +\t\t\t\t     Private::CameraAcquired,\n>  \t\t\t\t     Private::CameraConfigured);\n>  \tif (ret < 0)\n>  \t\treturn ret;\n> @@ -938,7 +946,8 @@ std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraConfigured,\n> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> +\t\t\t\t     Private::CameraConfigured,\n>  \t\t\t\t     Private::CameraRunning);\n>  \tif (ret < 0)\n>  \t\treturn nullptr;\n> @@ -972,7 +981,7 @@ int Camera::queueRequest(Request *request)\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n>  \tif (ret < 0)\n>  \t\treturn ret;\n>  \n> @@ -1022,7 +1031,7 @@ int Camera::start(const ControlList *controls)\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraConfigured);\n> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured);\n>  \tif (ret < 0)\n>  \t\treturn ret;\n>  \n> @@ -1056,7 +1065,7 @@ int Camera::stop()\n>  {\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n>  \tif (ret < 0)\n>  \t\treturn ret;\n>  \n> @@ -1082,7 +1091,7 @@ void Camera::requestComplete(Request *request)\n>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>  \n>  \t/* Disconnected cameras are still able to complete requests. */\n> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n>  \tif (ret < 0 && ret != -ENODEV)\n>  \t\tLOG(Camera, Fatal) << \"Trying to complete a request when stopped\";\n>","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 EE1B2BDC66\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 26 Mar 2021 02:34:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2771A68D66;\n\tFri, 26 Mar 2021 03:34:01 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 21F71602E3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 26 Mar 2021 03:33:59 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 80B35443;\n\tFri, 26 Mar 2021 03:33:58 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Y8HHKEq0\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1616726038;\n\tbh=qmifuN127PSqkPgOqzqTOdJ/ecXs8DxrM5v7yA/burQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Y8HHKEq0pKeQbtzZ9b+OG8p7M9H2AhggUKLodsi+xm7Cj8F/80W6jdkHtwZRc8sO3\n\tQFhWjyQaZ6BKKPgMIYZsNHH+mInjBVgd7t1U+Qe5piv0nvZjIXflp2RJXOqSRhcXGM\n\tyXp+bQESYO++RhWSq83Ww6yvM54XJIeMJFUk5xHw=","Date":"Fri, 26 Mar 2021 04:33:15 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<YF1H673Y0M/bpuZU@pendragon.ideasonboard.com>","References":"<20210325134231.1400051-1-kieran.bingham@ideasonboard.com>\n\t<20210325134231.1400051-10-kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20210325134231.1400051-10-kieran.bingham@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":15951,"web_url":"https://patchwork.libcamera.org/comment/15951/","msgid":"<3aaec354-8f44-be0d-10b3-0be2e103dd5b@ideasonboard.com>","date":"2021-03-26T15:33:40","subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 26/03/2021 02:33, Laurent Pinchart wrote:\n> Hi Kieran,\n> \n> Thank you for the patch.\n> \n> On Thu, Mar 25, 2021 at 01:42:27PM +0000, Kieran Bingham wrote:\n>> The camera object has a state machine to ensure calls are only made\n>> when in the correct state. It isn't easy to identify where things happen\n>> when assertions fail so add extra information to make this clearer.\n>>\n>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>> ---\n>>  src/libcamera/camera.cpp | 51 +++++++++++++++++++++++-----------------\n>>  1 file changed, 30 insertions(+), 21 deletions(-)\n>>\n>> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n>> index b86bff4745b2..336ab8695ab3 100644\n>> --- a/src/libcamera/camera.cpp\n>> +++ b/src/libcamera/camera.cpp\n>> @@ -346,8 +346,9 @@ public:\n>>  \t\tconst std::set<Stream *> &streams);\n>>  \t~Private();\n>>  \n>> -\tint isAccessAllowed(State state, bool allowDisconnected = false) const;\n>> -\tint isAccessAllowed(State low, State high,\n>> +\tint isAccessAllowed(const char *from, State state,\n>> +\t\t\t    bool allowDisconnected = false) const;\n>> +\tint isAccessAllowed(const char *from, State low, State high,\n>>  \t\t\t    bool allowDisconnected = false) const;\n> \n> It's not very nice to have to pass the function name on every call :-S\n> Is there any way we could improve this ?\n> \n> The option that first came to my mind was macros, which isn't really\n> nice either, and then I came across this really really nice trick:\n\nIndeed, I was avoiding macros ...\n\n> \n> \tint isAccessAllowed(State state, bool allowDisconnected = false,\n> \t\t\t    const char *from = __builtin_FUNCTION()) const;\n> \tint isAccessAllowed(State low, State high,\n> \t\t\t    bool allowDisconnected = false,\n> \t\t\t    const char *from = __builtin_FUNCTION()) const;\n> \n\nBut this I like... trying it now ;-)\n\n\n\n>>  \n>>  \tvoid disconnect();\n>> @@ -384,7 +385,8 @@ static const char *const camera_state_names[] = {\n>>  \t\"Running\",\n>>  };\n>>  \n>> -int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const\n>> +int Camera::Private::isAccessAllowed(const char *from, State state,\n>> +\t\t\t\t     bool allowDisconnected) const\n>>  {\n>>  \tif (!allowDisconnected && disconnected_)\n>>  \t\treturn -ENODEV;\n>> @@ -395,14 +397,16 @@ int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const\n>>  \n>>  \tASSERT(static_cast<unsigned int>(state) < std::size(camera_state_names));\n>>  \n>> -\tLOG(Camera, Debug) << \"Camera in \" << camera_state_names[currentState]\n>> -\t\t\t   << \" state trying operation requiring state \"\n>> -\t\t\t   << camera_state_names[state];\n>> +\tLOG(Camera, Warning) << \"Camera in \" << camera_state_names[currentState]\n> \n> For operations coming from applications, should this really be a warning\n> ? I suppose it's good to warn them. Could you mention this change in the\n> commit message ?\n\nYes, I believe applications should know if they have caused an action\nthat was invalid.\n\n> \n>> +\t\t\t     << \" state trying operation [\"\n>> +\t\t\t     << from << \"] requiring state \"\n>> +\t\t\t     << camera_state_names[state];\n>>  \n>>  \treturn -EACCES;\n>>  }\n>>  \n>> -int Camera::Private::isAccessAllowed(State low, State high,\n>> +int Camera::Private::isAccessAllowed(const char *from,\n>> +\t\t\t\t     State low, State high,\n>>  \t\t\t\t     bool allowDisconnected) const\n>>  {\n>>  \tif (!allowDisconnected && disconnected_)\n>> @@ -415,10 +419,11 @@ int Camera::Private::isAccessAllowed(State low, State high,\n>>  \tASSERT(static_cast<unsigned int>(low) < std::size(camera_state_names) &&\n>>  \t       static_cast<unsigned int>(high) < std::size(camera_state_names));\n>>  \n>> -\tLOG(Camera, Debug) << \"Camera in \" << camera_state_names[currentState]\n>> -\t\t\t   << \" state trying operation requiring state between \"\n>> -\t\t\t   << camera_state_names[low] << \" and \"\n>> -\t\t\t   << camera_state_names[high];\n>> +\tLOG(Camera, Warning) << \"Camera in \" << camera_state_names[currentState]\n>> +\t\t\t     << \" state trying operation [\" << from\n>> +\t\t\t     << \"] requiring state between \"\n>> +\t\t\t     << camera_state_names[low] << \" and \"\n>> +\t\t\t     << camera_state_names[high];\n>>  \n>>  \treturn -EACCES;\n>>  }\n>> @@ -646,7 +651,7 @@ int Camera::exportFrameBuffers(Stream *stream,\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraConfigured);\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured);\n> \n> __func__ is standard (since C99), __FUNCTION__ is gcc-specific. OK,\n> __builtin_FUNCTION() is also gcc-specific :-) I've tested it with gcc 7\n> to 10 and clang 7 to 11, it compiles on all of them.\n> \n> With this change,\n\nwith __func__ or __builtin_FUNCTION()?\n\nif __func__ is standard, should we use that as the default initialiser?\n\n../src/libcamera/camera.cpp:353:27: error: ‘__func__’ is not defined\noutside of function scope [-Werror]\n  353 |        const char *from = __func__) const;\n      |                           ^~~~~~~~\n\nWell that answers that then ;-)\n\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nWorks nicely, and now tells us what function caused the issue at least:\n\n(Ignore the fact that these are successful, I hacked out the actual\nconditional to check the output)\n\n> [113:13:27.373321847] [1457151]  WARN Camera camera.cpp:401 Camera in Running state trying operation [queueRequest] requiring state Running\n> [113:13:27.408814517] [1457154]  WARN Camera camera.cpp:401 Camera in Running state trying operation [requestComplete] requiring state Running\n\n\nIt's a shame we don't report the line number of the invalid access as\nopposed to the line number of the isAccessAllowed() but I think we're ok\nthere. The 'from' tells us how to get back to who made the call.\n\n\n\n> \n>>  \tif (ret < 0)\n>>  \t\treturn ret;\n>>  \n>> @@ -693,7 +698,7 @@ int Camera::acquire()\n>>  \t * No manual locking is required as PipelineHandler::lock() is\n>>  \t * thread-safe.\n>>  \t */\n>> -\tint ret = d->isAccessAllowed(Private::CameraAvailable);\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraAvailable);\n>>  \tif (ret < 0)\n>>  \t\treturn ret == -EACCES ? -EBUSY : ret;\n>>  \n>> @@ -726,7 +731,8 @@ int Camera::release()\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraAvailable,\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n>> +\t\t\t\t     Private::CameraAvailable,\n>>  \t\t\t\t     Private::CameraConfigured, true);\n>>  \tif (ret < 0)\n>>  \t\treturn ret == -EACCES ? -EBUSY : ret;\n>> @@ -805,7 +811,8 @@ std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(const StreamR\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraAvailable,\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n>> +\t\t\t\t     Private::CameraAvailable,\n>>  \t\t\t\t     Private::CameraRunning);\n>>  \tif (ret < 0)\n>>  \t\treturn nullptr;\n>> @@ -866,7 +873,8 @@ int Camera::configure(CameraConfiguration *config)\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraAcquired,\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n>> +\t\t\t\t     Private::CameraAcquired,\n>>  \t\t\t\t     Private::CameraConfigured);\n>>  \tif (ret < 0)\n>>  \t\treturn ret;\n>> @@ -938,7 +946,8 @@ std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraConfigured,\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n>> +\t\t\t\t     Private::CameraConfigured,\n>>  \t\t\t\t     Private::CameraRunning);\n>>  \tif (ret < 0)\n>>  \t\treturn nullptr;\n>> @@ -972,7 +981,7 @@ int Camera::queueRequest(Request *request)\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n>>  \tif (ret < 0)\n>>  \t\treturn ret;\n>>  \n>> @@ -1022,7 +1031,7 @@ int Camera::start(const ControlList *controls)\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraConfigured);\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured);\n>>  \tif (ret < 0)\n>>  \t\treturn ret;\n>>  \n>> @@ -1056,7 +1065,7 @@ int Camera::stop()\n>>  {\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n>>  \tif (ret < 0)\n>>  \t\treturn ret;\n>>  \n>> @@ -1082,7 +1091,7 @@ void Camera::requestComplete(Request *request)\n>>  \tPrivate *const d = LIBCAMERA_D_PTR();\n>>  \n>>  \t/* Disconnected cameras are still able to complete requests. */\n>> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n>> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n>>  \tif (ret < 0 && ret != -ENODEV)\n>>  \t\tLOG(Camera, Fatal) << \"Trying to complete a request when stopped\";\n>>  \n>","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 44A9DC32EB\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 26 Mar 2021 15:33:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9B90B68D6A;\n\tFri, 26 Mar 2021 16:33:44 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5CC28602D7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 26 Mar 2021 16:33:43 +0100 (CET)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C41A6443;\n\tFri, 26 Mar 2021 16:33:42 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"rJQ2ZRg8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1616772822;\n\tbh=ubJtUWKNhlsyxfJRcgDyYJ0jhHL1hqXvgPy1w7KQ4Zs=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=rJQ2ZRg8ZuewsWBwwz4C0xL4UtMTzQEx3atfacmQerHE/tOL6Df1sIIWxz7bpMW5Z\n\tTnco7PfkQ04cdZ2vhbXKjIoi3MUcWUJHXAGJ2iju3QxQSvWfCdHtN/nfw6kpTArPqY\n\tm87VGPEAab4vYy8z/txt0K6Uo8ZuBbTdLLOkXUWU=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20210325134231.1400051-1-kieran.bingham@ideasonboard.com>\n\t<20210325134231.1400051-10-kieran.bingham@ideasonboard.com>\n\t<YF1H673Y0M/bpuZU@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<3aaec354-8f44-be0d-10b3-0be2e103dd5b@ideasonboard.com>","Date":"Fri, 26 Mar 2021 15:33:40 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<YF1H673Y0M/bpuZU@pendragon.ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","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>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":15954,"web_url":"https://patchwork.libcamera.org/comment/15954/","msgid":"<YF4DsEisf76HY8me@pendragon.ideasonboard.com>","date":"2021-03-26T15:54:24","subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Fri, Mar 26, 2021 at 03:33:40PM +0000, Kieran Bingham wrote:\n> On 26/03/2021 02:33, Laurent Pinchart wrote:\n> > On Thu, Mar 25, 2021 at 01:42:27PM +0000, Kieran Bingham wrote:\n> >> The camera object has a state machine to ensure calls are only made\n> >> when in the correct state. It isn't easy to identify where things happen\n> >> when assertions fail so add extra information to make this clearer.\n> >>\n> >> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> >> ---\n> >>  src/libcamera/camera.cpp | 51 +++++++++++++++++++++++-----------------\n> >>  1 file changed, 30 insertions(+), 21 deletions(-)\n> >>\n> >> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> >> index b86bff4745b2..336ab8695ab3 100644\n> >> --- a/src/libcamera/camera.cpp\n> >> +++ b/src/libcamera/camera.cpp\n> >> @@ -346,8 +346,9 @@ public:\n> >>  \t\tconst std::set<Stream *> &streams);\n> >>  \t~Private();\n> >>  \n> >> -\tint isAccessAllowed(State state, bool allowDisconnected = false) const;\n> >> -\tint isAccessAllowed(State low, State high,\n> >> +\tint isAccessAllowed(const char *from, State state,\n> >> +\t\t\t    bool allowDisconnected = false) const;\n> >> +\tint isAccessAllowed(const char *from, State low, State high,\n> >>  \t\t\t    bool allowDisconnected = false) const;\n> > \n> > It's not very nice to have to pass the function name on every call :-S\n> > Is there any way we could improve this ?\n> > \n> > The option that first came to my mind was macros, which isn't really\n> > nice either, and then I came across this really really nice trick:\n> \n> Indeed, I was avoiding macros ...\n> \n> > \n> > \tint isAccessAllowed(State state, bool allowDisconnected = false,\n> > \t\t\t    const char *from = __builtin_FUNCTION()) const;\n> > \tint isAccessAllowed(State low, State high,\n> > \t\t\t    bool allowDisconnected = false,\n> > \t\t\t    const char *from = __builtin_FUNCTION()) const;\n> > \n> \n> But this I like... trying it now ;-)\n> \n> \n> \n> >>  \n> >>  \tvoid disconnect();\n> >> @@ -384,7 +385,8 @@ static const char *const camera_state_names[] = {\n> >>  \t\"Running\",\n> >>  };\n> >>  \n> >> -int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const\n> >> +int Camera::Private::isAccessAllowed(const char *from, State state,\n> >> +\t\t\t\t     bool allowDisconnected) const\n> >>  {\n> >>  \tif (!allowDisconnected && disconnected_)\n> >>  \t\treturn -ENODEV;\n> >> @@ -395,14 +397,16 @@ int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const\n> >>  \n> >>  \tASSERT(static_cast<unsigned int>(state) < std::size(camera_state_names));\n> >>  \n> >> -\tLOG(Camera, Debug) << \"Camera in \" << camera_state_names[currentState]\n> >> -\t\t\t   << \" state trying operation requiring state \"\n> >> -\t\t\t   << camera_state_names[state];\n> >> +\tLOG(Camera, Warning) << \"Camera in \" << camera_state_names[currentState]\n> > \n> > For operations coming from applications, should this really be a warning\n> > ? I suppose it's good to warn them. Could you mention this change in the\n> > commit message ?\n> \n> Yes, I believe applications should know if they have caused an action\n> that was invalid.\n> \n> > \n> >> +\t\t\t     << \" state trying operation [\"\n> >> +\t\t\t     << from << \"] requiring state \"\n> >> +\t\t\t     << camera_state_names[state];\n> >>  \n> >>  \treturn -EACCES;\n> >>  }\n> >>  \n> >> -int Camera::Private::isAccessAllowed(State low, State high,\n> >> +int Camera::Private::isAccessAllowed(const char *from,\n> >> +\t\t\t\t     State low, State high,\n> >>  \t\t\t\t     bool allowDisconnected) const\n> >>  {\n> >>  \tif (!allowDisconnected && disconnected_)\n> >> @@ -415,10 +419,11 @@ int Camera::Private::isAccessAllowed(State low, State high,\n> >>  \tASSERT(static_cast<unsigned int>(low) < std::size(camera_state_names) &&\n> >>  \t       static_cast<unsigned int>(high) < std::size(camera_state_names));\n> >>  \n> >> -\tLOG(Camera, Debug) << \"Camera in \" << camera_state_names[currentState]\n> >> -\t\t\t   << \" state trying operation requiring state between \"\n> >> -\t\t\t   << camera_state_names[low] << \" and \"\n> >> -\t\t\t   << camera_state_names[high];\n> >> +\tLOG(Camera, Warning) << \"Camera in \" << camera_state_names[currentState]\n> >> +\t\t\t     << \" state trying operation [\" << from\n> >> +\t\t\t     << \"] requiring state between \"\n> >> +\t\t\t     << camera_state_names[low] << \" and \"\n> >> +\t\t\t     << camera_state_names[high];\n> >>  \n> >>  \treturn -EACCES;\n> >>  }\n> >> @@ -646,7 +651,7 @@ int Camera::exportFrameBuffers(Stream *stream,\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraConfigured);\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured);\n> > \n> > __func__ is standard (since C99), __FUNCTION__ is gcc-specific. OK,\n> > __builtin_FUNCTION() is also gcc-specific :-) I've tested it with gcc 7\n> > to 10 and clang 7 to 11, it compiles on all of them.\n> > \n> > With this change,\n> \n> with __func__ or __builtin_FUNCTION()?\n> \n> if __func__ is standard, should we use that as the default initialiser?\n\nI'd love if we could. I prefer standard solutions, but\n__builtin_FUNCTION() is such a neat trick :-)\n\n> ../src/libcamera/camera.cpp:353:27: error: ‘__func__’ is not defined\n> outside of function scope [-Werror]\n>   353 |        const char *from = __func__) const;\n>       |                           ^~~~~~~~\n> \n> Well that answers that then ;-)\n> \n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> Works nicely, and now tells us what function caused the issue at least:\n> \n> (Ignore the fact that these are successful, I hacked out the actual\n> conditional to check the output)\n> \n> > [113:13:27.373321847] [1457151]  WARN Camera camera.cpp:401 Camera in Running state trying operation [queueRequest] requiring state Running\n> > [113:13:27.408814517] [1457154]  WARN Camera camera.cpp:401 Camera in Running state trying operation [requestComplete] requiring state Running\n> \n> It's a shame we don't report the line number of the invalid access as\n> opposed to the line number of the isAccessAllowed() but I think we're ok\n> there. The 'from' tells us how to get back to who made the call.\n\nNote that there's a __builtin_LINE() ;-) But I don't think we need to go\nthat way, the name should be enough.\n\nNitpicking, how about \"trying queueRequest()\" instead of \"trying\noperation [queueRequest]\" ? Up to you.\n\n> >>  \tif (ret < 0)\n> >>  \t\treturn ret;\n> >>  \n> >> @@ -693,7 +698,7 @@ int Camera::acquire()\n> >>  \t * No manual locking is required as PipelineHandler::lock() is\n> >>  \t * thread-safe.\n> >>  \t */\n> >> -\tint ret = d->isAccessAllowed(Private::CameraAvailable);\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraAvailable);\n> >>  \tif (ret < 0)\n> >>  \t\treturn ret == -EACCES ? -EBUSY : ret;\n> >>  \n> >> @@ -726,7 +731,8 @@ int Camera::release()\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraAvailable,\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> >> +\t\t\t\t     Private::CameraAvailable,\n> >>  \t\t\t\t     Private::CameraConfigured, true);\n> >>  \tif (ret < 0)\n> >>  \t\treturn ret == -EACCES ? -EBUSY : ret;\n> >> @@ -805,7 +811,8 @@ std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(const StreamR\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraAvailable,\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> >> +\t\t\t\t     Private::CameraAvailable,\n> >>  \t\t\t\t     Private::CameraRunning);\n> >>  \tif (ret < 0)\n> >>  \t\treturn nullptr;\n> >> @@ -866,7 +873,8 @@ int Camera::configure(CameraConfiguration *config)\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraAcquired,\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> >> +\t\t\t\t     Private::CameraAcquired,\n> >>  \t\t\t\t     Private::CameraConfigured);\n> >>  \tif (ret < 0)\n> >>  \t\treturn ret;\n> >> @@ -938,7 +946,8 @@ std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraConfigured,\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__,\n> >> +\t\t\t\t     Private::CameraConfigured,\n> >>  \t\t\t\t     Private::CameraRunning);\n> >>  \tif (ret < 0)\n> >>  \t\treturn nullptr;\n> >> @@ -972,7 +981,7 @@ int Camera::queueRequest(Request *request)\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n> >>  \tif (ret < 0)\n> >>  \t\treturn ret;\n> >>  \n> >> @@ -1022,7 +1031,7 @@ int Camera::start(const ControlList *controls)\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraConfigured);\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured);\n> >>  \tif (ret < 0)\n> >>  \t\treturn ret;\n> >>  \n> >> @@ -1056,7 +1065,7 @@ int Camera::stop()\n> >>  {\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n> >>  \tif (ret < 0)\n> >>  \t\treturn ret;\n> >>  \n> >> @@ -1082,7 +1091,7 @@ void Camera::requestComplete(Request *request)\n> >>  \tPrivate *const d = LIBCAMERA_D_PTR();\n> >>  \n> >>  \t/* Disconnected cameras are still able to complete requests. */\n> >> -\tint ret = d->isAccessAllowed(Private::CameraRunning);\n> >> +\tint ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);\n> >>  \tif (ret < 0 && ret != -ENODEV)\n> >>  \t\tLOG(Camera, Fatal) << \"Trying to complete a request when stopped\";\n> >>","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 D6F21C32EA\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 26 Mar 2021 15:55:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1A18B68D6E;\n\tFri, 26 Mar 2021 16:55:10 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5A16468D58\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 26 Mar 2021 16:55:08 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C872C443;\n\tFri, 26 Mar 2021 16:55:07 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"gWm8D6s8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1616774108;\n\tbh=AlFZflNQR3OBFAi5Vp9j9ceq+TXHUgFINVHtCOu7TD8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=gWm8D6s8/eWPU2lWzKUebXv/oy1so0JJOygaysAI/DHJHF6wCiSmgEN/HXwaJPGRJ\n\togNyaS6l/XDCcw9H1Evg6/DxgKGtOcRu+yatHOHS1qWF8Rr6q+mphSRHJ1hw0BLrVX\n\thl1baAQSWdNu46DTWfT2w1q1UrPqTU8eRV5In6zo=","Date":"Fri, 26 Mar 2021 17:54:24 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<YF4DsEisf76HY8me@pendragon.ideasonboard.com>","References":"<20210325134231.1400051-1-kieran.bingham@ideasonboard.com>\n\t<20210325134231.1400051-10-kieran.bingham@ideasonboard.com>\n\t<YF1H673Y0M/bpuZU@pendragon.ideasonboard.com>\n\t<3aaec354-8f44-be0d-10b3-0be2e103dd5b@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<3aaec354-8f44-be0d-10b3-0be2e103dd5b@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":15957,"web_url":"https://patchwork.libcamera.org/comment/15957/","msgid":"<a4ffc598-aa65-7561-5703-0df4583dca71@ideasonboard.com>","date":"2021-03-26T16:06:04","subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 26/03/2021 15:54, Laurent Pinchart wrote:\n> Note that there's a __builtin_LINE() ;-) But I don't think we need to go\n> that way, the name should be enough.\n> \n> Nitpicking, how about \"trying queueRequest()\" instead of \"trying\n> operation [queueRequest]\" ? Up to you.\n\nLooks good to me, updated.","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 74964C32EA\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 26 Mar 2021 16:06:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BFE8768D6F;\n\tFri, 26 Mar 2021 17:06:08 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3F38568D58\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 26 Mar 2021 17:06:07 +0100 (CET)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AA2E7443;\n\tFri, 26 Mar 2021 17:06:06 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"m2QeCFPF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1616774766;\n\tbh=lmEnawTO00VQYjG7uddrB5Rat7wq58c3c4WpA2Rszy8=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=m2QeCFPFecNlzYoPv5ijfpYdhMJY9dD/nUGePWkK1vYCqXNffpb3vG4xvrqO26mwG\n\tO8KrrNYhgT/3+jxph02e/h03DiDhjjSuyBFRwlJbeO+Mab49r3TrUJ00WchIQrdFaF\n\tTgN4ufcyf8z4B6ePJyUDCaVcDW9rn0Yqn5dAE2po=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20210325134231.1400051-1-kieran.bingham@ideasonboard.com>\n\t<20210325134231.1400051-10-kieran.bingham@ideasonboard.com>\n\t<YF1H673Y0M/bpuZU@pendragon.ideasonboard.com>\n\t<3aaec354-8f44-be0d-10b3-0be2e103dd5b@ideasonboard.com>\n\t<YF4DsEisf76HY8me@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\tmQINBFYE/WYBEACs1PwjMD9rgCu1hlIiUA1AXR4rv2v+BCLUq//vrX5S5bjzxKAryRf0uHat\n\tV/zwz6hiDrZuHUACDB7X8OaQcwhLaVlq6byfoBr25+hbZG7G3+5EUl9cQ7dQEdvNj6V6y/SC\n\trRanWfelwQThCHckbobWiQJfK9n7rYNcPMq9B8e9F020LFH7Kj6YmO95ewJGgLm+idg1Kb3C\n\tpotzWkXc1xmPzcQ1fvQMOfMwdS+4SNw4rY9f07Xb2K99rjMwZVDgESKIzhsDB5GY465sCsiQ\n\tcSAZRxqE49RTBq2+EQsbrQpIc8XiffAB8qexh5/QPzCmR4kJgCGeHIXBtgRj+nIkCJPZvZtf\n\tKr2EAbc6tgg6DkAEHJb+1okosV09+0+TXywYvtEop/WUOWQ+zo+Y/OBd+8Ptgt1pDRyOBzL8\n\tRXa8ZqRf0Mwg75D+dKntZeJHzPRJyrlfQokngAAs4PaFt6UfS+ypMAF37T6CeDArQC41V3ko\n\tlPn1yMsVD0p+6i3DPvA/GPIksDC4owjnzVX9kM8Zc5Cx+XoAN0w5Eqo4t6qEVbuettxx55gq\n\t8K8FieAjgjMSxngo/HST8TpFeqI5nVeq0/lqtBRQKumuIqDg+Bkr4L1V/PSB6XgQcOdhtd36\n\tOe9X9dXB8YSNt7VjOcO7BTmFn/Z8r92mSAfHXpb07YJWJosQOQARAQABtDBLaWVyYW4gQmlu\n\tZ2hhbSA8a2llcmFuLmJpbmdoYW1AaWRlYXNvbmJvYXJkLmNvbT6JAlcEEwEKAEECGwMFCwkI\n\tBwIGFQgJCgsCBBYCAwECHgECF4ACGQEWIQSQLdeYP70o/eNy1HqhHkZyEKRh/QUCXWTtygUJ\n\tCyJXZAAKCRChHkZyEKRh/f8dEACTDsbLN2nioNZMwyLuQRUAFcXNolDX48xcUXsWS2QjxaPm\n\tVsJx8Uy8aYkS85mdPBh0C83OovQR/OVbr8AxhGvYqBs3nQvbWuTl/+4od7DfK2VZOoKBAu5S\n\tQK2FYuUcikDqYcFWJ8DQnubxfE8dvzojHEkXw0sA4igINHDDFX3HJGZtLio+WpEFQtCbfTAG\n\tYZslasz1YZRbwEdSsmO3/kqy5eMnczlm8a21A3fKUo3g8oAZEFM+f4DUNzqIltg31OAB/kZS\n\tenKZQ/SWC8PmLg/ZXBrReYakxXtkP6w3FwMlzOlhGxqhIRNiAJfXJBaRhuUWzPOpEDE9q5YJ\n\tBmqQL2WJm1VSNNVxbXJHpaWMH1sA2R00vmvRrPXGwyIO0IPYeUYQa3gsy6k+En/aMQJd27dp\n\taScf9am9PFICPY5T4ppneeJLif2lyLojo0mcHOV+uyrds9XkLpp14GfTkeKPdPMrLLTsHRfH\n\tfA4I4OBpRrEPiGIZB/0im98MkGY/Mu6qxeZmYLCcgD6qz4idOvfgVOrNh+aA8HzIVR+RMW8H\n\tQGBN9f0E3kfwxuhl3omo6V7lDw8XOdmuWZNC9zPq1UfryVHANYbLGz9KJ4Aw6M+OgBC2JpkD\n\thXMdHUkC+d20dwXrwHTlrJi1YNp6rBc+xald3wsUPOZ5z8moTHUX/uPA/qhGsbkCDQRWBP1m\n\tARAAzijkb+Sau4hAncr1JjOY+KyFEdUNxRy+hqTJdJfaYihxyaj0Ee0P0zEi35CbE6lgU0Uz\n\ttih9fiUbSV3wfsWqg1Ut3/5rTKu7kLFp15kF7eqvV4uezXRD3Qu4yjv/rMmEJbbD4cTvGCYI\n\td6MDC417f7vK3hCbCVIZSp3GXxyC1LU+UQr3fFcOyCwmP9vDUR9JV0BSqHHxRDdpUXE26Dk6\n\tmhf0V1YkspE5St814ETXpEus2urZE5yJIUROlWPIL+hm3NEWfAP06vsQUyLvr/GtbOT79vXl\n\tEn1aulcYyu20dRRxhkQ6iILaURcxIAVJJKPi8dsoMnS8pB0QW12AHWuirPF0g6DiuUfPmrA5\n\tPKe56IGlpkjc8cO51lIxHkWTpCMWigRdPDexKX+Sb+W9QWK/0JjIc4t3KBaiG8O4yRX8ml2R\n\t+rxfAVKM6V769P/hWoRGdgUMgYHFpHGSgEt80OKK5HeUPy2cngDUXzwrqiM5Sz6Od0qw5pCk\n\tNlXqI0W/who0iSVM+8+RmyY0OEkxEcci7rRLsGnM15B5PjLJjh1f2ULYkv8s4SnDwMZ/kE04\n\t/UqCMK/KnX8pwXEMCjz0h6qWNpGwJ0/tYIgQJZh6bqkvBrDogAvuhf60Sogw+mH8b+PBlx1L\n\toeTK396wc+4c3BfiC6pNtUS5GpsPMMjYMk7kVvEAEQEAAYkCPAQYAQoAJgIbDBYhBJAt15g/\n\tvSj943LUeqEeRnIQpGH9BQJdizzIBQkLSKZiAAoJEKEeRnIQpGH9eYgQAJpjaWNgqNOnMTmD\n\tMJggbwjIotypzIXfhHNCeTkG7+qCDlSaBPclcPGYrTwCt0YWPU2TgGgJrVhYT20ierN8LUvj\n\t6qOPTd+Uk7NFzL65qkh80ZKNBFddx1AabQpSVQKbdcLb8OFs85kuSvFdgqZwgxA1vl4TFhNz\n\tPZ79NAmXLackAx3sOVFhk4WQaKRshCB7cSl+RIng5S/ThOBlwNlcKG7j7W2MC06BlTbdEkUp\n\tECzuuRBv8wX4OQl+hbWbB/VKIx5HKlLu1eypen/5lNVzSqMMIYkkZcjV2SWQyUGxSwq0O/sx\n\tS0A8/atCHUXOboUsn54qdxrVDaK+6jIAuo8JiRWctP16KjzUM7MO0/+4zllM8EY57rXrj48j\n\tsbEYX0YQnzaj+jO6kJtoZsIaYR7rMMq9aUAjyiaEZpmP1qF/2sYenDx0Fg2BSlLvLvXM0vU8\n\tpQk3kgDu7kb/7PRYrZvBsr21EIQoIjXbZxDz/o7z95frkP71EaICttZ6k9q5oxxA5WC6sTXc\n\tMW8zs8avFNuA9VpXt0YupJd2ijtZy2mpZNG02fFVXhIn4G807G7+9mhuC4XG5rKlBBUXTvPU\n\tAfYnB4JBDLmLzBFavQfvonSfbitgXwCG3vS+9HEwAjU30Bar1PEOmIbiAoMzuKeRm2LVpmq4\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<a4ffc598-aa65-7561-5703-0df4583dca71@ideasonboard.com>","Date":"Fri, 26 Mar 2021 16:06:04 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<YF4DsEisf76HY8me@pendragon.ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report\n\tfunction which fails access control","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>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]