shared: fix type shenanigans for data pointer of nm_memdup_maybe_a()

The type of the "data" pointer may not be compatible with the type of
the "to_free" / output pointer. This is due to constness, and that we
are unable in C to remove constness from a type.

For example,

    {
        const char *const *data = ...;
        gs_free const char **cpy_to_free = NULL;
        const char **cpy;

        cpy = nm_memdup_maybe_a (300, data, NM_PTRARRAY_LEN (data) + 1, &cpy_to_free);
    }

is prefectly valid , but would not have compiled.

It shows that "data" is not of type "*(&cpy_to_free)", but rather
it might be a non-const pointer of the same type.

Fixes: d0e1d0e626 ('shared: propagate types in nm_malloc_maybe_a(), nm_malloc0_maybe_a(), nm_memdup_maybe_a()')
This commit is contained in:
Thomas Haller 2019-05-16 11:21:55 +02:00
parent 98f4122673
commit fbddd27e73

View file

@ -1574,14 +1574,13 @@ nm_memdup (gconstpointer data, gsize size)
({ \
const gsize _size = (size); \
typeof (to_free) _to_free_md = (to_free); \
typeof (*(_to_free_md)) _data = (data); \
typeof (*(_to_free_md)) _ptr_md = NULL; \
typeof (*_to_free_md) _ptr_md = NULL; \
\
nm_assert (_to_free_md && !*_to_free_md); \
\
if (_size > 0u) { \
_ptr_md = nm_malloc_maybe_a ((alloca_maxlen), _size, _to_free_md); \
memcpy (_ptr_md, _data, _size); \
memcpy (_ptr_md, (data), _size); \
} \
\
_ptr_md; \