]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
object: Fix CALLBACK macros with GCC 12
authorTobias Brunner <tobias@strongswan.org>
Thu, 19 May 2022 09:10:07 +0000 (11:10 +0200)
committerTobias Brunner <tobias@strongswan.org>
Mon, 27 Jun 2022 12:03:32 +0000 (14:03 +0200)
GCC 12 produces weird code when a callback is called directly (e.g.
parse_bool() via parse_option() in vici_config.c).  Instead of the actual
pointer, it explicitly passes 0 as first argument, which likely causes
a segmentation fault.  It doesn't happen when called indirectly via
function pointer that has void* as first argument, which this patch
kinda replicates for direct calls to avoid the issue.

Closes strongswan/strongswan#1053

src/libstrongswan/utils/utils/object.h

index 174ea812a14330a88bff2509ff45beb7614f5132..da580c01af87e8ab52581f60f1579180af81292c 100644 (file)
 #define CALLBACK(name, ret, param1, ...) \
        static ret _cb_##name(union {void *_generic; param1;} \
        __attribute__((transparent_union)), ##__VA_ARGS__); \
-       static typeof(_cb_##name) *name = (typeof(_cb_##name)*)_cb_##name; \
+       static ret (*name)(void*, ##__VA_ARGS__) = _cb_##name; \
        static ret _cb_##name(param1, ##__VA_ARGS__)
 
 /**
        __attribute__((transparent_union)), \
        union {void *_generic; param2;} \
        __attribute__((transparent_union)), ##__VA_ARGS__); \
-       static typeof(_cb_##name) *name = (typeof(_cb_##name)*)_cb_##name; \
+       static ret (*name)(void*, void*, ##__VA_ARGS__) = _cb_##name; \
        static ret _cb_##name(param1, param2, ##__VA_ARGS__)
 
 #endif /** OBJECT_H_ @} */