• Gustavo A. R. Silva's avatar
    wifi: cfg80211: Avoid clashing function prototypes · 02ae6a70
    Gustavo A. R. Silva authored
    When built with Control Flow Integrity, function prototypes between
    caller and function declaration must match. These mismatches are visible
    at compile time with the new -Wcast-function-type-strict in Clang[1].
    
    Fix a total of 73 warnings like these:
    
    drivers/net/wireless/intersil/orinoco/wext.c:1379:27: warning: cast from 'int (*)(struct net_device *, struct iw_request_info *, struct iw_param *, char *)' to 'iw_handler' (aka 'int (*)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *)') converts to incompatible function type [-Wcast-function-type-strict]
            IW_HANDLER(SIOCGIWPOWER,        (iw_handler)orinoco_ioctl_getpower),
                                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    ../net/wireless/wext-compat.c:1607:33: warning: cast from 'int (*)(struct net_device *, struct iw_request_info *, struct iw_point *, char *)' to 'iw_handler' (aka 'int (*)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *)') converts to incompatible function type [-Wcast-function-type-strict]
            [IW_IOCTL_IDX(SIOCSIWGENIE)]    = (iw_handler) cfg80211_wext_siwgenie,
                                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    ../drivers/net/wireless/intersil/orinoco/wext.c:1390:27: error: incompatible function pointer types initializing 'const iw_handler' (aka 'int (*const)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *)') with an expression of type 'int (struct net_device *, struct iw_request_info *, struct iw_param *, char *)' [-Wincompatible-function-pointer-types]
            IW_HANDLER(SIOCGIWRETRY,        cfg80211_wext_giwretry),
                                            ^~~~~~~~~~~~~~~~~~~~~~
    
    The cfg80211 Wireless Extension handler callbacks (iw_handler) use a
    union for the data argument. Actually use the union and perform explicit
    member selection in the function body instead of having a function
    prototype mismatch. There are no resulting binary differences
    before/after changes.
    
    These changes were made partly manually and partly with the help of
    Coccinelle.
    
    Link: https://github.com/KSPP/linux/issues/234
    Link: https://reviews.llvm.org/D134831 [1]
    Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
    Link: https://lore.kernel.org/r/a68822bf8dd587988131bb6a295280cb4293f05d.1667934775.git.gustavoars@kernel.org
    02ae6a70
wext.c 34.2 KB