[Nut-upsdev] drivers/bcmxcp.c portability issue

Arjen de Korte nut+devel at de-korte.org
Wed Dec 16 07:37:06 UTC 2009


Citeren Tim Rice <tim op multitalents.net>:

> This may be the least intrusive way to fix it.
> ------------------------------
> --- nut-svn/drivers/bcmxcp.c.old	2009-12-15 09:32:45.000000000 -0800
> +++ nut-svn/drivers/bcmxcp.c	2009-12-15 14:03:34.602495008 -0800
> @@ -871,13 +871,14 @@
>
>  int init_outlet(unsigned char len)
>  {
> -	unsigned char answer[len];
> +	unsigned char *answer;
>  	int iIndex = 0, res, num;
>  	int num_outlet, size_outlet;
>  	int outlet_num, outlet_state;
>  	short auto_dly_off, auto_dly_on;
>  	char outlet_name[25];
>
> +	answer = xmalloc((size_t) len);
>  	res = command_read_sequence(PW_OUT_MON_BLOCK_REQ, answer);
>  	if (res <= 0)
>  		fatal_with_errno(EXIT_FAILURE, "Could not communicate with the ups");

Close, but no cigar. Since init_outlet() can also be called from  
upsdrv_initinfo(), this change will leak memory. You need to vall  
free(answer) to de-allocate the memory before leaving init_outlet().

When changing something in dynamic memory allocation, running  
'valgrind' is mandatory to check for leaks. While this isn't a 100%  
guarantee that there are no memory leaks (they may not get triggered),  
this will usually spot the most obvious ones like the above.

Best regards, Arjen
-- 
Please keep list traffic on the list




More information about the Nut-upsdev mailing list