Re: [PATCH 5/9] staging: media: atomisp: fix stack overflow in init_pipe_defaults()

2020-05-29 Thread Nathan Chancellor
On Fri, May 29, 2020 at 10:00:27PM +0200, Arnd Bergmann wrote:
> When building with clang, multiple copies of the structures to be
> initialized are passed around on the stack and copied locally, using an
> insane amount of stack space:
> 
> drivers/staging/media/atomisp/pci/sh_css.c:2371:1: error: stack frame size of 
> 26864 bytes in function 'create_pipe' [-Werror,-Wframe-larger-than=]
> 
> Use constantly-allocated variables plus an explicit memcpy()
> to avoid that.
> 
> Fixes: 6dc9a2568f84 ("media: atomisp: convert default struct values to use 
> compound-literals with designated initializers")
> Signed-off-by: Arnd Bergmann 

Reviewed-by: Nathan Chancellor 

> ---
>  drivers/staging/media/atomisp/pci/sh_css.c | 16 +++-
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/staging/media/atomisp/pci/sh_css.c 
> b/drivers/staging/media/atomisp/pci/sh_css.c
> index e91c6029c651..1e8b9d637116 100644
> --- a/drivers/staging/media/atomisp/pci/sh_css.c
> +++ b/drivers/staging/media/atomisp/pci/sh_css.c
> @@ -2264,6 +2264,12 @@ static enum ia_css_err
>  init_pipe_defaults(enum ia_css_pipe_mode mode,
>  struct ia_css_pipe *pipe,
>  bool copy_pipe) {
> + static const struct ia_css_pipe default_pipe = IA_CSS_DEFAULT_PIPE;
> + static const struct ia_css_preview_settings preview = 
> IA_CSS_DEFAULT_PREVIEW_SETTINGS;
> + static const struct ia_css_capture_settings capture = 
> IA_CSS_DEFAULT_CAPTURE_SETTINGS;
> + static const struct ia_css_video_settings video = 
> IA_CSS_DEFAULT_VIDEO_SETTINGS;
> + static const struct ia_css_yuvpp_settings yuvpp = 
> IA_CSS_DEFAULT_YUVPP_SETTINGS;
> +
>   if (!pipe)
>   {
>   IA_CSS_ERROR("NULL pipe parameter");
> @@ -2271,14 +2277,14 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,
>   }
>  
>   /* Initialize pipe to pre-defined defaults */
> - *pipe = IA_CSS_DEFAULT_PIPE;
> + memcpy(pipe, _pipe, sizeof(default_pipe));
>  
>   /* TODO: JB should not be needed, but temporary backward reference */
>   switch (mode)
>   {
>   case IA_CSS_PIPE_MODE_PREVIEW:
>   pipe->mode = IA_CSS_PIPE_ID_PREVIEW;
> - pipe->pipe_settings.preview = IA_CSS_DEFAULT_PREVIEW_SETTINGS;
> + memcpy(>pipe_settings.preview, , sizeof(preview));
>   break;
>   case IA_CSS_PIPE_MODE_CAPTURE:
>   if (copy_pipe) {
> @@ -2286,11 +2292,11 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,
>   } else {
>   pipe->mode = IA_CSS_PIPE_ID_CAPTURE;
>   }
> - pipe->pipe_settings.capture = IA_CSS_DEFAULT_CAPTURE_SETTINGS;
> + memcpy(>pipe_settings.capture, , sizeof(capture));
>   break;
>   case IA_CSS_PIPE_MODE_VIDEO:
>   pipe->mode = IA_CSS_PIPE_ID_VIDEO;
> - pipe->pipe_settings.video = IA_CSS_DEFAULT_VIDEO_SETTINGS;
> + memcpy(>pipe_settings.video, , sizeof(video));
>   break;
>   case IA_CSS_PIPE_MODE_ACC:
>   pipe->mode = IA_CSS_PIPE_ID_ACC;
> @@ -2300,7 +2306,7 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,
>   break;
>   case IA_CSS_PIPE_MODE_YUVPP:
>   pipe->mode = IA_CSS_PIPE_ID_YUVPP;
> - pipe->pipe_settings.yuvpp = IA_CSS_DEFAULT_YUVPP_SETTINGS;
> + memcpy(>pipe_settings.yuvpp, , sizeof(yuvpp));
>   break;
>   default:
>   return IA_CSS_ERR_INVALID_ARGUMENTS;
> -- 
> 2.26.2
> 


[PATCH 5/9] staging: media: atomisp: fix stack overflow in init_pipe_defaults()

2020-05-29 Thread Arnd Bergmann
When building with clang, multiple copies of the structures to be
initialized are passed around on the stack and copied locally, using an
insane amount of stack space:

drivers/staging/media/atomisp/pci/sh_css.c:2371:1: error: stack frame size of 
26864 bytes in function 'create_pipe' [-Werror,-Wframe-larger-than=]

Use constantly-allocated variables plus an explicit memcpy()
to avoid that.

Fixes: 6dc9a2568f84 ("media: atomisp: convert default struct values to use 
compound-literals with designated initializers")
Signed-off-by: Arnd Bergmann 
---
 drivers/staging/media/atomisp/pci/sh_css.c | 16 +++-
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/media/atomisp/pci/sh_css.c 
b/drivers/staging/media/atomisp/pci/sh_css.c
index e91c6029c651..1e8b9d637116 100644
--- a/drivers/staging/media/atomisp/pci/sh_css.c
+++ b/drivers/staging/media/atomisp/pci/sh_css.c
@@ -2264,6 +2264,12 @@ static enum ia_css_err
 init_pipe_defaults(enum ia_css_pipe_mode mode,
   struct ia_css_pipe *pipe,
   bool copy_pipe) {
+   static const struct ia_css_pipe default_pipe = IA_CSS_DEFAULT_PIPE;
+   static const struct ia_css_preview_settings preview = 
IA_CSS_DEFAULT_PREVIEW_SETTINGS;
+   static const struct ia_css_capture_settings capture = 
IA_CSS_DEFAULT_CAPTURE_SETTINGS;
+   static const struct ia_css_video_settings video = 
IA_CSS_DEFAULT_VIDEO_SETTINGS;
+   static const struct ia_css_yuvpp_settings yuvpp = 
IA_CSS_DEFAULT_YUVPP_SETTINGS;
+
if (!pipe)
{
IA_CSS_ERROR("NULL pipe parameter");
@@ -2271,14 +2277,14 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,
}
 
/* Initialize pipe to pre-defined defaults */
-   *pipe = IA_CSS_DEFAULT_PIPE;
+   memcpy(pipe, _pipe, sizeof(default_pipe));
 
/* TODO: JB should not be needed, but temporary backward reference */
switch (mode)
{
case IA_CSS_PIPE_MODE_PREVIEW:
pipe->mode = IA_CSS_PIPE_ID_PREVIEW;
-   pipe->pipe_settings.preview = IA_CSS_DEFAULT_PREVIEW_SETTINGS;
+   memcpy(>pipe_settings.preview, , sizeof(preview));
break;
case IA_CSS_PIPE_MODE_CAPTURE:
if (copy_pipe) {
@@ -2286,11 +2292,11 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,
} else {
pipe->mode = IA_CSS_PIPE_ID_CAPTURE;
}
-   pipe->pipe_settings.capture = IA_CSS_DEFAULT_CAPTURE_SETTINGS;
+   memcpy(>pipe_settings.capture, , sizeof(capture));
break;
case IA_CSS_PIPE_MODE_VIDEO:
pipe->mode = IA_CSS_PIPE_ID_VIDEO;
-   pipe->pipe_settings.video = IA_CSS_DEFAULT_VIDEO_SETTINGS;
+   memcpy(>pipe_settings.video, , sizeof(video));
break;
case IA_CSS_PIPE_MODE_ACC:
pipe->mode = IA_CSS_PIPE_ID_ACC;
@@ -2300,7 +2306,7 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,
break;
case IA_CSS_PIPE_MODE_YUVPP:
pipe->mode = IA_CSS_PIPE_ID_YUVPP;
-   pipe->pipe_settings.yuvpp = IA_CSS_DEFAULT_YUVPP_SETTINGS;
+   memcpy(>pipe_settings.yuvpp, , sizeof(yuvpp));
break;
default:
return IA_CSS_ERR_INVALID_ARGUMENTS;
-- 
2.26.2