Re: [PATCH 1/1] ccs: Make (non-)use of uninitialised variables more robust

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 05/01/2021 13:49, Sakari Ailus wrote:
> GCC with W=2 level of kernel compiler warnings warns about the use of
> uninitialised variables in a few locations. While these uninitialised
> variables were not used in reality, this still produced compiler warnings.
> 
> Address this by assigning the variables to NULL and checking for NULL in
> places it is not expected, returning -EPROTO in that case. This provides
> at least some sanity checking at runtime as the compiler appears unable to
> do that at compile time.
> 
> Reported-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx>
> Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>

Acked-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx>

This fixes the warnings!

Thank you,

	Hans

> ---
>  drivers/media/i2c/ccs/ccs-data.c | 24 ++++++++++++++++++++----
>  1 file changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/media/i2c/ccs/ccs-data.c b/drivers/media/i2c/ccs/ccs-data.c
> index 59338a6704af..99b2b515058a 100644
> --- a/drivers/media/i2c/ccs/ccs-data.c
> +++ b/drivers/media/i2c/ccs/ccs-data.c
> @@ -214,7 +214,7 @@ static int ccs_data_parse_regs(struct bin_container *bin,
>  			       size_t *__num_regs, const void *payload,
>  			       const void *endp, struct device *dev)
>  {
> -	struct ccs_reg *regs_base, *regs;
> +	struct ccs_reg *regs_base = NULL, *regs = NULL;
>  	size_t num_regs = 0;
>  	u16 addr = 0;
>  
> @@ -285,6 +285,9 @@ static int ccs_data_parse_regs(struct bin_container *bin,
>  		if (!bin->base) {
>  			bin_reserve(bin, len);
>  		} else if (__regs) {
> +			if (!regs)
> +				return -EPROTO;
> +
>  			regs->addr = addr;
>  			regs->len = len;
>  			regs->value = bin_alloc(bin, len);
> @@ -305,8 +308,12 @@ static int ccs_data_parse_regs(struct bin_container *bin,
>  	if (__num_regs)
>  		*__num_regs = num_regs;
>  
> -	if (bin->base && __regs)
> +	if (bin->base && __regs) {
> +		if (!regs_base)
> +			return -EPROTO;
> +
>  		*__regs = regs_base;
> +	}
>  
>  	return 0;
>  }
> @@ -425,7 +432,7 @@ static int ccs_data_parse_rules(struct bin_container *bin,
>  				size_t *__num_rules, const void *payload,
>  				const void *endp, struct device *dev)
>  {
> -	struct ccs_rule *rules_base, *rules = NULL, *next_rule;
> +	struct ccs_rule *rules_base = NULL, *rules = NULL, *next_rule = NULL;
>  	size_t num_rules = 0;
>  	const void *__next_rule = payload;
>  	int rval;
> @@ -483,6 +490,9 @@ static int ccs_data_parse_rules(struct bin_container *bin,
>  			} else {
>  				unsigned int i;
>  
> +				if (!next_rule)
> +					return -EPROTO;
> +
>  				rules = next_rule;
>  				next_rule++;
>  
> @@ -555,6 +565,9 @@ static int ccs_data_parse_rules(struct bin_container *bin,
>  		bin_reserve(bin, sizeof(*rules) * num_rules);
>  		*__num_rules = num_rules;
>  	} else {
> +		if (!rules_base)
> +			return -EPROTO;
> +
>  		*__rules = rules_base;
>  	}
>  
> @@ -690,7 +703,7 @@ static int ccs_data_parse_pdaf(struct bin_container *bin, struct ccs_pdaf_pix_lo
>  	}
>  
>  	for (i = 0; i < max_block_type_id; i++) {
> -		struct ccs_pdaf_pix_loc_pixel_desc_group *pdgroup;
> +		struct ccs_pdaf_pix_loc_pixel_desc_group *pdgroup = NULL;
>  		unsigned int j;
>  
>  		if (!is_contained(__num_pixel_descs, endp))
> @@ -721,6 +734,9 @@ static int ccs_data_parse_pdaf(struct bin_container *bin, struct ccs_pdaf_pix_lo
>  			if (!bin->base)
>  				continue;
>  
> +			if (!pdgroup)
> +				return -EPROTO;
> +
>  			pdesc = &pdgroup->descs[j];
>  			pdesc->pixel_type = __pixel_desc->pixel_type;
>  			pdesc->small_offset_x = __pixel_desc->small_offset_x;
> 




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux