media: atomisp: Fix smatch warnings caused by atomisp custom assert() usage
Commit Message
The atomisp code base has a custom assert() macro, a couple of functions
use this in a construction like the following:
assert(pipe);
assert(pipe->stream);
if ((!pipe) || (!pipe->stream)) {
ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
"allocate_mipi_frames(%p) exit: ...\n",
pipe);
return -EINVAL;
}
The second assert is seen by smatch as dereferencing "pipe" in the above
example (and dereferencing "dvs_6axis_config" / "me" in the 2 other cases).
Following by the dereferenced variable being checked (a second time)
in the following if () statement.
This triggers the following smatch warnings:
drivers/staging/media/atomisp/pci/sh_css_mipi.c:356 allocate_mipi_frames() warn: variable dereferenced before check 'pipe' (see line 355)
drivers/staging/media/atomisp/pci/sh_css_mipi.c:562 send_mipi_frames() warn: variable dereferenced before check 'pipe' (see line 561)
drivers/staging/media/atomisp/pci/sh_css_param_dvs.c:208 free_dvs_6axis_table() warn: variable dereferenced before check 'dvs_6axis_config' (see line 206)
drivers/staging/media/atomisp/pci/sh_css_sp.c:1255 sh_css_sp_init_pipeline() warn: variable dereferenced before check 'me->stages' (see line 1224)
The custom assert() macro actually expands to a BUG() call and BUG()
calls should not be used in the kernel.
Remove the assert() calls to fix the smatch warnings and in case of
[allocate|send]_mipi_frames() also remove the if () return -EINVAL
block since these functions are never called with a NULL pipe.
Reported-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Note:
1. No Closes: tag since Hans Verkuil reported this in an offlist email.
2. All the other assert() calls really should also be removed.
I've put this on my todo list.
---
drivers/staging/media/atomisp/pci/sh_css_mipi.c | 16 ----------------
.../staging/media/atomisp/pci/sh_css_param_dvs.c | 3 ---
drivers/staging/media/atomisp/pci/sh_css_sp.c | 4 ----
3 files changed, 23 deletions(-)
Comments
On 27/07/2023 17:56, Hans de Goede wrote:
> The atomisp code base has a custom assert() macro, a couple of functions
> use this in a construction like the following:
>
> assert(pipe);
> assert(pipe->stream);
> if ((!pipe) || (!pipe->stream)) {
> ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
> "allocate_mipi_frames(%p) exit: ...\n",
> pipe);
> return -EINVAL;
> }
>
> The second assert is seen by smatch as dereferencing "pipe" in the above
> example (and dereferencing "dvs_6axis_config" / "me" in the 2 other cases).
>
> Following by the dereferenced variable being checked (a second time)
> in the following if () statement.
>
> This triggers the following smatch warnings:
> drivers/staging/media/atomisp/pci/sh_css_mipi.c:356 allocate_mipi_frames() warn: variable dereferenced before check 'pipe' (see line 355)
> drivers/staging/media/atomisp/pci/sh_css_mipi.c:562 send_mipi_frames() warn: variable dereferenced before check 'pipe' (see line 561)
> drivers/staging/media/atomisp/pci/sh_css_param_dvs.c:208 free_dvs_6axis_table() warn: variable dereferenced before check 'dvs_6axis_config' (see line 206)
> drivers/staging/media/atomisp/pci/sh_css_sp.c:1255 sh_css_sp_init_pipeline() warn: variable dereferenced before check 'me->stages' (see line 1224)
After testing this patch with smatch I am still left with this warning:
drivers/staging/media/atomisp/pci/sh_css_sp.c:1251 sh_css_sp_init_pipeline() warn: variable dereferenced before check 'me->stages' (see line 1220)
Regards,
Hans
>
> The custom assert() macro actually expands to a BUG() call and BUG()
> calls should not be used in the kernel.
>
> Remove the assert() calls to fix the smatch warnings and in case of
> [allocate|send]_mipi_frames() also remove the if () return -EINVAL
> block since these functions are never called with a NULL pipe.
>
> Reported-by: Hans Verkuil <hverkuil@xs4all.nl>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
> Note:
> 1. No Closes: tag since Hans Verkuil reported this in an offlist email.
> 2. All the other assert() calls really should also be removed.
> I've put this on my todo list.
> ---
> drivers/staging/media/atomisp/pci/sh_css_mipi.c | 16 ----------------
> .../staging/media/atomisp/pci/sh_css_param_dvs.c | 3 ---
> drivers/staging/media/atomisp/pci/sh_css_sp.c | 4 ----
> 3 files changed, 23 deletions(-)
>
> diff --git a/drivers/staging/media/atomisp/pci/sh_css_mipi.c b/drivers/staging/media/atomisp/pci/sh_css_mipi.c
> index b20acaab0595..ced21dedf7ac 100644
> --- a/drivers/staging/media/atomisp/pci/sh_css_mipi.c
> +++ b/drivers/staging/media/atomisp/pci/sh_css_mipi.c
> @@ -351,15 +351,6 @@ allocate_mipi_frames(struct ia_css_pipe *pipe,
> ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
> "allocate_mipi_frames(%p) enter:\n", pipe);
>
> - assert(pipe);
> - assert(pipe->stream);
> - if ((!pipe) || (!pipe->stream)) {
> - ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
> - "allocate_mipi_frames(%p) exit: pipe or stream is null.\n",
> - pipe);
> - return -EINVAL;
> - }
> -
> if (IS_ISP2401 && pipe->stream->config.online) {
> ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
> "allocate_mipi_frames(%p) exit: no buffers needed for 2401 pipe mode.\n",
> @@ -557,13 +548,6 @@ send_mipi_frames(struct ia_css_pipe *pipe)
>
> IA_CSS_ENTER_PRIVATE("pipe=%p", pipe);
>
> - assert(pipe);
> - assert(pipe->stream);
> - if (!pipe || !pipe->stream) {
> - IA_CSS_ERROR("pipe or stream is null");
> - return -EINVAL;
> - }
> -
> /* multi stream video needs mipi buffers */
> /* nothing to be done in other cases. */
> if (pipe->stream->config.mode != IA_CSS_INPUT_MODE_BUFFERED_SENSOR) {
> diff --git a/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c b/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c
> index ff0082d02af3..5174bc210ae1 100644
> --- a/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c
> +++ b/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c
> @@ -202,9 +202,6 @@ generate_dvs_6axis_table_from_config(struct ia_css_dvs_6axis_config
> void
> free_dvs_6axis_table(struct ia_css_dvs_6axis_config **dvs_6axis_config)
> {
> - assert(dvs_6axis_config);
> - assert(*dvs_6axis_config);
> -
> if ((dvs_6axis_config) && (*dvs_6axis_config)) {
> IA_CSS_ENTER_PRIVATE("dvs_6axis_config %p", (*dvs_6axis_config));
> if ((*dvs_6axis_config)->xcoords_y) {
> diff --git a/drivers/staging/media/atomisp/pci/sh_css_sp.c b/drivers/staging/media/atomisp/pci/sh_css_sp.c
> index 4ef1c9e61ea8..5ecc982ad725 100644
> --- a/drivers/staging/media/atomisp/pci/sh_css_sp.c
> +++ b/drivers/staging/media/atomisp/pci/sh_css_sp.c
> @@ -1215,10 +1215,6 @@ sh_css_sp_init_pipeline(struct ia_css_pipeline *me,
> unsigned int thread_id;
> u8 if_config_index, tmp_if_config_index;
>
> - assert(me);
> -
> - assert(me->stages);
> -
> first_binary = me->stages->binary;
>
> if (input_mode == IA_CSS_INPUT_MODE_SENSOR ||
Hi,
On 7/28/23 09:23, Hans Verkuil wrote:
> On 27/07/2023 17:56, Hans de Goede wrote:
>> The atomisp code base has a custom assert() macro, a couple of functions
>> use this in a construction like the following:
>>
>> assert(pipe);
>> assert(pipe->stream);
>> if ((!pipe) || (!pipe->stream)) {
>> ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
>> "allocate_mipi_frames(%p) exit: ...\n",
>> pipe);
>> return -EINVAL;
>> }
>>
>> The second assert is seen by smatch as dereferencing "pipe" in the above
>> example (and dereferencing "dvs_6axis_config" / "me" in the 2 other cases).
>>
>> Following by the dereferenced variable being checked (a second time)
>> in the following if () statement.
>>
>> This triggers the following smatch warnings:
>> drivers/staging/media/atomisp/pci/sh_css_mipi.c:356 allocate_mipi_frames() warn: variable dereferenced before check 'pipe' (see line 355)
>> drivers/staging/media/atomisp/pci/sh_css_mipi.c:562 send_mipi_frames() warn: variable dereferenced before check 'pipe' (see line 561)
>> drivers/staging/media/atomisp/pci/sh_css_param_dvs.c:208 free_dvs_6axis_table() warn: variable dereferenced before check 'dvs_6axis_config' (see line 206)
>> drivers/staging/media/atomisp/pci/sh_css_sp.c:1255 sh_css_sp_init_pipeline() warn: variable dereferenced before check 'me->stages' (see line 1224)
>
> After testing this patch with smatch I am still left with this warning:
>
> drivers/staging/media/atomisp/pci/sh_css_sp.c:1251 sh_css_sp_init_pipeline() warn: variable dereferenced before check 'me->stages' (see line 1220)
Ok.
I'll drop the sh_css_sp.c change from this patch and send a v2 of this one + a new patch to address the 'me->stages' issues.
Regards,
Hans
>> The custom assert() macro actually expands to a BUG() call and BUG()
>> calls should not be used in the kernel.
>>
>> Remove the assert() calls to fix the smatch warnings and in case of
>> [allocate|send]_mipi_frames() also remove the if () return -EINVAL
>> block since these functions are never called with a NULL pipe.
>>
>> Reported-by: Hans Verkuil <hverkuil@xs4all.nl>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>> Note:
>> 1. No Closes: tag since Hans Verkuil reported this in an offlist email.
>> 2. All the other assert() calls really should also be removed.
>> I've put this on my todo list.
>> ---
>> drivers/staging/media/atomisp/pci/sh_css_mipi.c | 16 ----------------
>> .../staging/media/atomisp/pci/sh_css_param_dvs.c | 3 ---
>> drivers/staging/media/atomisp/pci/sh_css_sp.c | 4 ----
>> 3 files changed, 23 deletions(-)
>>
>> diff --git a/drivers/staging/media/atomisp/pci/sh_css_mipi.c b/drivers/staging/media/atomisp/pci/sh_css_mipi.c
>> index b20acaab0595..ced21dedf7ac 100644
>> --- a/drivers/staging/media/atomisp/pci/sh_css_mipi.c
>> +++ b/drivers/staging/media/atomisp/pci/sh_css_mipi.c
>> @@ -351,15 +351,6 @@ allocate_mipi_frames(struct ia_css_pipe *pipe,
>> ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
>> "allocate_mipi_frames(%p) enter:\n", pipe);
>>
>> - assert(pipe);
>> - assert(pipe->stream);
>> - if ((!pipe) || (!pipe->stream)) {
>> - ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
>> - "allocate_mipi_frames(%p) exit: pipe or stream is null.\n",
>> - pipe);
>> - return -EINVAL;
>> - }
>> -
>> if (IS_ISP2401 && pipe->stream->config.online) {
>> ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
>> "allocate_mipi_frames(%p) exit: no buffers needed for 2401 pipe mode.\n",
>> @@ -557,13 +548,6 @@ send_mipi_frames(struct ia_css_pipe *pipe)
>>
>> IA_CSS_ENTER_PRIVATE("pipe=%p", pipe);
>>
>> - assert(pipe);
>> - assert(pipe->stream);
>> - if (!pipe || !pipe->stream) {
>> - IA_CSS_ERROR("pipe or stream is null");
>> - return -EINVAL;
>> - }
>> -
>> /* multi stream video needs mipi buffers */
>> /* nothing to be done in other cases. */
>> if (pipe->stream->config.mode != IA_CSS_INPUT_MODE_BUFFERED_SENSOR) {
>> diff --git a/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c b/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c
>> index ff0082d02af3..5174bc210ae1 100644
>> --- a/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c
>> +++ b/drivers/staging/media/atomisp/pci/sh_css_param_dvs.c
>> @@ -202,9 +202,6 @@ generate_dvs_6axis_table_from_config(struct ia_css_dvs_6axis_config
>> void
>> free_dvs_6axis_table(struct ia_css_dvs_6axis_config **dvs_6axis_config)
>> {
>> - assert(dvs_6axis_config);
>> - assert(*dvs_6axis_config);
>> -
>> if ((dvs_6axis_config) && (*dvs_6axis_config)) {
>> IA_CSS_ENTER_PRIVATE("dvs_6axis_config %p", (*dvs_6axis_config));
>> if ((*dvs_6axis_config)->xcoords_y) {
>> diff --git a/drivers/staging/media/atomisp/pci/sh_css_sp.c b/drivers/staging/media/atomisp/pci/sh_css_sp.c
>> index 4ef1c9e61ea8..5ecc982ad725 100644
>> --- a/drivers/staging/media/atomisp/pci/sh_css_sp.c
>> +++ b/drivers/staging/media/atomisp/pci/sh_css_sp.c
>> @@ -1215,10 +1215,6 @@ sh_css_sp_init_pipeline(struct ia_css_pipeline *me,
>> unsigned int thread_id;
>> u8 if_config_index, tmp_if_config_index;
>>
>> - assert(me);
>> -
>> - assert(me->stages);
>> -
>> first_binary = me->stages->binary;
>>
>> if (input_mode == IA_CSS_INPUT_MODE_SENSOR ||
>
@@ -351,15 +351,6 @@ allocate_mipi_frames(struct ia_css_pipe *pipe,
ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
"allocate_mipi_frames(%p) enter:\n", pipe);
- assert(pipe);
- assert(pipe->stream);
- if ((!pipe) || (!pipe->stream)) {
- ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
- "allocate_mipi_frames(%p) exit: pipe or stream is null.\n",
- pipe);
- return -EINVAL;
- }
-
if (IS_ISP2401 && pipe->stream->config.online) {
ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
"allocate_mipi_frames(%p) exit: no buffers needed for 2401 pipe mode.\n",
@@ -557,13 +548,6 @@ send_mipi_frames(struct ia_css_pipe *pipe)
IA_CSS_ENTER_PRIVATE("pipe=%p", pipe);
- assert(pipe);
- assert(pipe->stream);
- if (!pipe || !pipe->stream) {
- IA_CSS_ERROR("pipe or stream is null");
- return -EINVAL;
- }
-
/* multi stream video needs mipi buffers */
/* nothing to be done in other cases. */
if (pipe->stream->config.mode != IA_CSS_INPUT_MODE_BUFFERED_SENSOR) {
@@ -202,9 +202,6 @@ generate_dvs_6axis_table_from_config(struct ia_css_dvs_6axis_config
void
free_dvs_6axis_table(struct ia_css_dvs_6axis_config **dvs_6axis_config)
{
- assert(dvs_6axis_config);
- assert(*dvs_6axis_config);
-
if ((dvs_6axis_config) && (*dvs_6axis_config)) {
IA_CSS_ENTER_PRIVATE("dvs_6axis_config %p", (*dvs_6axis_config));
if ((*dvs_6axis_config)->xcoords_y) {
@@ -1215,10 +1215,6 @@ sh_css_sp_init_pipeline(struct ia_css_pipeline *me,
unsigned int thread_id;
u8 if_config_index, tmp_if_config_index;
- assert(me);
-
- assert(me->stages);
-
first_binary = me->stages->binary;
if (input_mode == IA_CSS_INPUT_MODE_SENSOR ||