root/lib/memcat_p.c
// 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);