[lvm-devel] clvmd-cman.c: another unchecked malloc

Jim Meyering jim at meyering.net
Fri Apr 27 10:00:54 UTC 2007


Jim Meyering <jim at meyering.net> wrote:

> There's an unchecked malloc in clvmd-cman.c's get_members function:
>
> 	if (node_updown == NULL) {
> 		node_updown =
> 			(int *) malloc(sizeof(int) *
> 				       max(num_nodes, max_updown_nodes));
> 		memset(node_updown, 0,
> 		       sizeof(int) * max(num_nodes, max_updown_nodes));
> 	}
>
> Here's a fix.
> At the same time, I've taken the liberty of factoring out
> the common sub-expression (buffer length) and eliminating
> the cast on malloc's return value.
>
> 	* daemons/clvmd/clvmd-cman.c (get_members): Don't dereference NULL
> 	upon failed malloc.
>
> Index: daemons/clvmd/clvmd-cman.c
> ===================================================================
> RCS file: /cvs/lvm2/LVM2/daemons/clvmd/clvmd-cman.c,v
> retrieving revision 1.17
> diff -u -p -r1.17 clvmd-cman.c
> --- daemons/clvmd/clvmd-cman.c	23 Apr 2007 14:55:28 -0000	1.17
> +++ daemons/clvmd/clvmd-cman.c	26 Apr 2007 13:46:02 -0000
> @@ -320,11 +320,10 @@ static void get_members()
>  	}
>
>  	if (node_updown == NULL) {
> -		node_updown =
> -			(int *) malloc(sizeof(int) *
> -				       max(num_nodes, max_updown_nodes));
> -		memset(node_updown, 0,
> -		       sizeof(int) * max(num_nodes, max_updown_nodes));
> +		size_t buf_len = sizeof(int) * max(num_nodes, max_updown_nodes));

Whoops.
Now that I've installed enough -devel packages to compile that file,
I see that there are too many parentheses above.
Here's a corrected patch:

Index: daemons/clvmd/clvmd-cman.c
===================================================================
RCS file: /cvs/lvm2/LVM2/daemons/clvmd/clvmd-cman.c,v
retrieving revision 1.17
diff -u -p -r1.17 clvmd-cman.c
--- daemons/clvmd/clvmd-cman.c	23 Apr 2007 14:55:28 -0000	1.17
+++ daemons/clvmd/clvmd-cman.c	27 Apr 2007 10:00:06 -0000
@@ -320,11 +320,10 @@ static void get_members()
 	}

 	if (node_updown == NULL) {
-		node_updown =
-			(int *) malloc(sizeof(int) *
-				       max(num_nodes, max_updown_nodes));
-		memset(node_updown, 0,
-		       sizeof(int) * max(num_nodes, max_updown_nodes));
+		size_t bufsiz = sizeof(int) * max(num_nodes, max_updown_nodes);
+		node_updown = malloc(bufsiz);
+		if (node_updown)
+			memset(node_updown, 0, bufsiz);
 	}
 }




More information about the lvm-devel mailing list