1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/slab.h> 4 5 /* 6 * Merge two NULL-terminated pointer arrays into a newly allocated 7 * array, which is also NULL-terminated. Nomenclature is inspired by 8 * memset_p() and memcat() found elsewhere in the kernel source tree. 9 */ 10 void **__memcat_p(void **a, void **b) 11 { 12 void **p = a, **new; 13 int nr; 14 15 /* count the elements in both arrays */ 16 for (nr = 0, p = a; *p; nr++, p++) 17 ; 18 for (p = b; *p; nr++, p++) 19 ; 20 /* one for the NULL-terminator */ 21 nr++; 22 23 new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL); 24 if (!new) 25 return NULL; 26 27 /* nr -> last index; p points to NULL in b[] */ 28 for (nr--; nr >= 0; nr--, p = p == b ? &a[nr] : p - 1) 29 new[nr] = *p; 30 31 return new; 32 } 33 EXPORT_SYMBOL_GPL(__memcat_p); 34 35