| // SPDX-License-Identifier: GPL-2.0 | 
 |  | 
 | #include <linux/slab.h> | 
 |  | 
 | /* | 
 |  * Merge two NULL-terminated pointer arrays into a newly allocated | 
 |  * array, which is also NULL-terminated. Nomenclature is inspired by | 
 |  * memset_p() and memcat() found elsewhere in the kernel source tree. | 
 |  */ | 
 | void **__memcat_p(void **a, void **b) | 
 | { | 
 | 	void **p = a, **new; | 
 | 	int nr; | 
 |  | 
 | 	/* count the elements in both arrays */ | 
 | 	for (nr = 0, p = a; *p; nr++, p++) | 
 | 		; | 
 | 	for (p = b; *p; nr++, p++) | 
 | 		; | 
 | 	/* one for the NULL-terminator */ | 
 | 	nr++; | 
 |  | 
 | 	new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL); | 
 | 	if (!new) | 
 | 		return NULL; | 
 |  | 
 | 	/* nr -> last index; p points to NULL in b[] */ | 
 | 	for (nr--; nr >= 0; nr--, p = p == b ? &a[nr] : p - 1) | 
 | 		new[nr] = *p; | 
 |  | 
 | 	return new; | 
 | } | 
 | EXPORT_SYMBOL_GPL(__memcat_p); | 
 |  |