Re: [PATCH 1/1] staging: unisys: small parser.c bug fix

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

 



Better, but it still needs more work.

On Fri, Nov 14, 2014 at 07:41:28AM -0500, Jeffrey Brown wrote:
> Replaced "cleanups" in the struct parser_init_guts with err_rgn,
> err_ctx, and out_rgn. The purpose is to remove redundant code and
> have proper error handling
> 
> Signed-off-by: Jeffrey Brown <Jeffrey.Brown@xxxxxxxxxx>
> ---
>  drivers/staging/unisys/visorchipset/parser.c |   43 +++++++++++--------------
>  1 files changed, 19 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/staging/unisys/visorchipset/parser.c b/drivers/staging/unisys/visorchipset/parser.c
> index 5f6a7b2..2897125 100644
> --- a/drivers/staging/unisys/visorchipset/parser.c
> +++ b/drivers/staging/unisys/visorchipset/parser.c
> @@ -64,8 +64,6 @@ parser_init_guts(u64 addr, u32 bytes, BOOL is_local,
>  		       MAX_CONTROLVM_PAYLOAD_BYTES);
>  		if (try_again)
>  			*try_again = TRUE;
> -		rc = NULL;
> -		goto cleanups;

return NULL;

>  	}
>  	ctx = kzalloc(allocbytes, GFP_KERNEL|__GFP_NORETRY);
>  	if (ctx == NULL) {
> @@ -74,7 +72,7 @@ parser_init_guts(u64 addr, u32 bytes, BOOL is_local,
>  		if (try_again)
>  			*try_again = TRUE;
>  		rc = NULL;
> -		goto cleanups;
> +		return NULL;
>  	}
>  
>  	ctx->allocbytes = allocbytes;
> @@ -90,7 +88,6 @@ parser_init_guts(u64 addr, u32 bytes, BOOL is_local,
>  			       __func__,
>  			       (unsigned long long)addr, (ulong)bytes);
>  			rc = NULL;
> -			goto cleanups;

goto err_ctx;

>  		}
>  		p = __va((ulong)(addr));
>  		memcpy(ctx->data, p, bytes);
> @@ -98,17 +95,17 @@ parser_init_guts(u64 addr, u32 bytes, BOOL is_local,
>  		rgn = visor_memregion_create(addr, bytes);
>  		if (!rgn) {
>  			rc = NULL;
> -			goto cleanups;
> +			goto err_ctx;
>  		}
>  		if (visor_memregion_read(rgn, 0, ctx->data, bytes) < 0) {
>  			rc = NULL;
> -			goto cleanups;
> +			goto err_ctx;
>  		}
>  	}
>  	if (!has_standard_payload_header) {
>  		ctx->byte_stream = TRUE;
>  		rc = ctx;
> -		goto cleanups;
> +		goto err_rgn;

This is not an error.  goto out_ctx;


>  	}
>  	phdr = (struct spar_controlvm_parameters_header *)(ctx->data);
>  	if (phdr->total_length != bytes) {
> @@ -116,7 +113,7 @@ parser_init_guts(u64 addr, u32 bytes, BOOL is_local,
>  		       __func__,
>  		       (ulong)(phdr->total_length), (ulong)(bytes));
>  		rc = NULL;
> -		goto cleanups;
> +		goto out_rgn;

This is an error.  goto err_rgn;

>  	}
>  	if (phdr->total_length < phdr->header_length) {
>  		ERRDRV("%s - total length < header length (%lu < %lu)",
> @@ -124,7 +121,7 @@ parser_init_guts(u64 addr, u32 bytes, BOOL is_local,
>  		       (ulong)(phdr->total_length),
>  		       (ulong)(phdr->header_length));
>  		rc = NULL;
> -		goto cleanups;
> +		goto err_rgn;
>  	}
>  	if (phdr->header_length <
>  	    sizeof(struct spar_controlvm_parameters_header)) {
> @@ -134,24 +131,22 @@ parser_init_guts(u64 addr, u32 bytes, BOOL is_local,
>  		       (ulong)(sizeof(
>  				struct spar_controlvm_parameters_header)));
>  		rc = NULL;
> -		goto cleanups;
> +		goto err_rgn;
>  	}
>  
> -	rc = ctx;
> -cleanups:
> -	if (rgn) {
> +out_rgn:
> +	if (rgn)
>  		visor_memregion_destroy(rgn);
> -		rgn = NULL;
> -	}
> -	if (rc) {
> -		controlvm_payload_bytes_buffered += ctx->param_bytes;
> -	} else {
> -		if (ctx) {
> -			parser_done(ctx);
> -			ctx = NULL;
> -		}
> -	}
> -	return rc;

Missing line:

	controlvm_payload_bytes_buffered += ctx->param_bytes;

> +
> +	return ctx;
> +
> +err_rgn:
> +	if (rgn)
> +		visor_memregion_destroy(rgn);
> +
> +err_ctx:
> +	kfree(ctx);
> +	return NULL;

regards,
dan carpenter

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux