hc
2023-12-06 d38611ca164021d018c1b23eee65bbebc09c63e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 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);