Skip to contentSkip to conversation

call panic if nl_table allocation fails

PATCH Akinobu Mita 4 participants 4 messages Aug 23, 2006 – Aug 29, 2006

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

This patch makes crash happen if initialization of nl_table fails in initcalls. It is better than getting use after free crash later.

Cc Patrick McHardy <[email protected]>
Cc David Miller <[email protected]>
net/netlink/af_netlink.c +6 -8
Index: work-failmalloc/net/netlink/af_netlink.c
===================================================================
@@ -1273,8 +1273,7 @@ netlink_kernel_create(int unit, unsigned
 	struct netlink_sock *nlk;
 	unsigned long *listeners = NULL;
 
-	if (!nl_table)
-		return NULL;
+	BUG_ON(!nl_table);
 
 	if (unit<0 || unit>=MAX_LINKS)
 		return NULL;
@@ -1745,11 +1744,8 @@ static int __init netlink_proto_init(voi
 		netlink_skb_parms_too_large();
 
 	nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);
-	if (!nl_table) {
-enomem:
-		printk(KERN_CRIT "netlink_init: Cannot allocate nl_table\n");
-		return -ENOMEM;
-	}
+	if (!nl_table)
+		goto panic;
 
 	if (num_physpages >= (128 * 1024))
 		max = num_physpages >> (21 - PAGE_SHIFT);
@@ -1769,7 +1765,7 @@ enomem:
 				nl_pid_hash_free(nl_table[i].hash.table,
 						 1 * sizeof(*hash->table));
 			kfree(nl_table);
-			goto enomem;
+			goto panic;
 		}
 		memset(hash->table, 0, 1 * sizeof(*hash->table));
 		hash->max_shift = order;
@@ -1786,6 +1782,8 @@ enomem:
 	rtnetlink_init();
 out:
 	return err;
+panic:
+	panic("netlink_init: Cannot allocate nl_table\n");
 }
 
 core_initcall(netlink_proto_init);
#1 lore raw
Quoted 4 lines · Akinobu Mita

This patch makes crash happen if initialization of nl_table fails in initcalls. It is better than getting use after free crash later.

nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);

Perhaps it'd be better to declare this as an array rather than allocating it at runtime.

- James

Signature · 2 lines
James Morris
<[email protected]>
#2 lore raw
Quoted 7 lines · James Morris
Quoted 2 lines · Akinobu Mita

This patch makes crash happen if initialization of nl_table fails in initcalls. It is better than getting use after free crash later.

Quoted 5 lines
Quoted 1 line
	nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);

Perhaps it'd be better to declare this as an array rather than allocating it at runtime.

That would still leave the MAX_LINKS allocations for the pid hashes which need to be allocated because they are dynamically sized. We could delay the pid hash allocations until the first bind happens of course, but I doubt it would be worth it since they start with just a single bucket.