Commit 89e70645 authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva Committed by Kalle Valo
Browse files

wifi: airo: Avoid clashing function prototypes

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 32 warnings like these:

../drivers/net/wireless/cisco/airo.c:7570:2: warning: cast from 'int (*)(struct net_device *, struct iw_request_info *, void *, 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) airo_config_commit,        /* SIOCSIWCOMMIT */
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The airo 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/236
Link: https://reviews.llvm.org/D134831

 [1]
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/820abf91d12809904696ddb8925ec5e1e0da3e4c.1667934775.git.gustavoars@kernel.org
parent ff7efc66
Loading
Loading
Loading
Loading
+108 −96
Original line number Diff line number Diff line
@@ -4807,7 +4807,8 @@ static int get_dec_u16(char *buffer, int *start, int limit)
}

static int airo_config_commit(struct net_device *dev,
			      struct iw_request_info *info, void *zwrq,
			      struct iw_request_info *info,
			      union iwreq_data *wrqu,
			      char *extra);

static inline int sniffing_mode(struct airo_info *ai)
@@ -5804,10 +5805,10 @@ static int airo_get_quality (StatusRid *status_rid, CapabilityRid *cap_rid)
 */
static int airo_get_name(struct net_device *dev,
			 struct iw_request_info *info,
			 char *cwrq,
			 union iwreq_data *cwrq,
			 char *extra)
{
	strcpy(cwrq, "IEEE 802.11-DS");
	strcpy(cwrq->name, "IEEE 802.11-DS");
	return 0;
}

@@ -5817,9 +5818,10 @@ static int airo_get_name(struct net_device *dev,
 */
static int airo_set_freq(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_freq *fwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_freq *fwrq = &wrqu->freq;
	struct airo_info *local = dev->ml_priv;
	int rc = -EINPROGRESS;		/* Call commit handler */

@@ -5858,9 +5860,10 @@ static int airo_set_freq(struct net_device *dev,
 */
static int airo_get_freq(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_freq *fwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_freq *fwrq = &wrqu->freq;
	struct airo_info *local = dev->ml_priv;
	StatusRid status_rid;		/* Card status info */
	int ch;
@@ -5890,9 +5893,10 @@ static int airo_get_freq(struct net_device *dev,
 */
static int airo_set_essid(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_point *dwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_point *dwrq = &wrqu->essid;
	struct airo_info *local = dev->ml_priv;
	SsidRid SSID_rid;		/* SSIDs */

@@ -5935,9 +5939,10 @@ static int airo_set_essid(struct net_device *dev,
 */
static int airo_get_essid(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_point *dwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_point *dwrq = &wrqu->essid;
	struct airo_info *local = dev->ml_priv;
	StatusRid status_rid;		/* Card status info */

@@ -5963,9 +5968,10 @@ static int airo_get_essid(struct net_device *dev,
 */
static int airo_set_wap(struct net_device *dev,
			struct iw_request_info *info,
			struct sockaddr *awrq,
			union iwreq_data *wrqu,
			char *extra)
{
	struct sockaddr *awrq = &wrqu->ap_addr;
	struct airo_info *local = dev->ml_priv;
	Cmd cmd;
	Resp rsp;
@@ -5998,9 +6004,10 @@ static int airo_set_wap(struct net_device *dev,
 */
static int airo_get_wap(struct net_device *dev,
			struct iw_request_info *info,
			struct sockaddr *awrq,
			union iwreq_data *wrqu,
			char *extra)
{
	struct sockaddr *awrq = &wrqu->ap_addr;
	struct airo_info *local = dev->ml_priv;
	StatusRid status_rid;		/* Card status info */

@@ -6019,9 +6026,10 @@ static int airo_get_wap(struct net_device *dev,
 */
static int airo_set_nick(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_point *dwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_point *dwrq = &wrqu->data;
	struct airo_info *local = dev->ml_priv;

	/* Check the size of the string */
@@ -6042,9 +6050,10 @@ static int airo_set_nick(struct net_device *dev,
 */
static int airo_get_nick(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_point *dwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_point *dwrq = &wrqu->data;
	struct airo_info *local = dev->ml_priv;

	readConfigRid(local, 1);
@@ -6061,9 +6070,10 @@ static int airo_get_nick(struct net_device *dev,
 */
static int airo_set_rate(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_param *vwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_param *vwrq = &wrqu->bitrate;
	struct airo_info *local = dev->ml_priv;
	CapabilityRid cap_rid;		/* Card capability info */
	u8	brate = 0;
@@ -6131,9 +6141,10 @@ static int airo_set_rate(struct net_device *dev,
 */
static int airo_get_rate(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_param *vwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_param *vwrq = &wrqu->bitrate;
	struct airo_info *local = dev->ml_priv;
	StatusRid status_rid;		/* Card status info */

@@ -6153,9 +6164,10 @@ static int airo_get_rate(struct net_device *dev,
 */
static int airo_set_rts(struct net_device *dev,
			struct iw_request_info *info,
			struct iw_param *vwrq,
			union iwreq_data *wrqu,
			char *extra)
{
	struct iw_param *vwrq = &wrqu->rts;
	struct airo_info *local = dev->ml_priv;
	int rthr = vwrq->value;

@@ -6177,9 +6189,10 @@ static int airo_set_rts(struct net_device *dev,
 */
static int airo_get_rts(struct net_device *dev,
			struct iw_request_info *info,
			struct iw_param *vwrq,
			union iwreq_data *wrqu,
			char *extra)
{
	struct iw_param *vwrq = &wrqu->rts;
	struct airo_info *local = dev->ml_priv;

	readConfigRid(local, 1);
@@ -6196,9 +6209,9 @@ static int airo_get_rts(struct net_device *dev,
 */
static int airo_set_frag(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_param *vwrq,
			 char *extra)
			 union iwreq_data *wrqu, char *extra)
{
	struct iw_param *vwrq = &wrqu->frag;
	struct airo_info *local = dev->ml_priv;
	int fthr = vwrq->value;

@@ -6221,9 +6234,10 @@ static int airo_set_frag(struct net_device *dev,
 */
static int airo_get_frag(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_param *vwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_param *vwrq = &wrqu->frag;
	struct airo_info *local = dev->ml_priv;

	readConfigRid(local, 1);
@@ -6240,9 +6254,10 @@ static int airo_get_frag(struct net_device *dev,
 */
static int airo_set_mode(struct net_device *dev,
			 struct iw_request_info *info,
			 __u32 *uwrq,
			 union iwreq_data *uwrq,
			 char *extra)
{
	__u32 mode = uwrq->mode;
	struct airo_info *local = dev->ml_priv;
	int reset = 0;

@@ -6250,7 +6265,7 @@ static int airo_set_mode(struct net_device *dev,
	if (sniffing_mode(local))
		reset = 1;

	switch(*uwrq) {
	switch (mode) {
		case IW_MODE_ADHOC:
			local->config.opmode &= ~MODE_CFG_MASK;
			local->config.opmode |= MODE_STA_IBSS;
@@ -6303,7 +6318,7 @@ static int airo_set_mode(struct net_device *dev,
 */
static int airo_get_mode(struct net_device *dev,
			 struct iw_request_info *info,
			 __u32 *uwrq,
			 union iwreq_data *uwrq,
			 char *extra)
{
	struct airo_info *local = dev->ml_priv;
@@ -6312,16 +6327,16 @@ static int airo_get_mode(struct net_device *dev,
	/* If not managed, assume it's ad-hoc */
	switch (local->config.opmode & MODE_CFG_MASK) {
		case MODE_STA_ESS:
			*uwrq = IW_MODE_INFRA;
			uwrq->mode = IW_MODE_INFRA;
			break;
		case MODE_AP:
			*uwrq = IW_MODE_MASTER;
			uwrq->mode = IW_MODE_MASTER;
			break;
		case MODE_AP_RPTR:
			*uwrq = IW_MODE_REPEAT;
			uwrq->mode = IW_MODE_REPEAT;
			break;
		default:
			*uwrq = IW_MODE_ADHOC;
			uwrq->mode = IW_MODE_ADHOC;
	}

	return 0;
@@ -6338,9 +6353,10 @@ static inline int valid_index(struct airo_info *ai, int index)
 */
static int airo_set_encode(struct net_device *dev,
			   struct iw_request_info *info,
			   struct iw_point *dwrq,
			   union iwreq_data *wrqu,
			   char *extra)
{
	struct iw_point *dwrq = &wrqu->encoding;
	struct airo_info *local = dev->ml_priv;
	int perm = (dwrq->flags & IW_ENCODE_TEMP ? 0 : 1);
	__le16 currentAuthType = local->config.authType;
@@ -6437,9 +6453,10 @@ static int airo_set_encode(struct net_device *dev,
 */
static int airo_get_encode(struct net_device *dev,
			   struct iw_request_info *info,
			   struct iw_point *dwrq,
			   union iwreq_data *wrqu,
			   char *extra)
{
	struct iw_point *dwrq = &wrqu->encoding;
	struct airo_info *local = dev->ml_priv;
	int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
	int wep_key_len;
@@ -6784,9 +6801,10 @@ static int airo_get_auth(struct net_device *dev,
 */
static int airo_set_txpow(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_param *vwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_param *vwrq = &wrqu->txpower;
	struct airo_info *local = dev->ml_priv;
	CapabilityRid cap_rid;		/* Card capability info */
	int i;
@@ -6821,9 +6839,10 @@ static int airo_set_txpow(struct net_device *dev,
 */
static int airo_get_txpow(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_param *vwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_param *vwrq = &wrqu->txpower;
	struct airo_info *local = dev->ml_priv;

	readConfigRid(local, 1);
@@ -6841,9 +6860,10 @@ static int airo_get_txpow(struct net_device *dev,
 */
static int airo_set_retry(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_param *vwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_param *vwrq = &wrqu->retry;
	struct airo_info *local = dev->ml_priv;
	int rc = -EINVAL;

@@ -6879,9 +6899,10 @@ static int airo_set_retry(struct net_device *dev,
 */
static int airo_get_retry(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_param *vwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_param *vwrq = &wrqu->retry;
	struct airo_info *local = dev->ml_priv;

	vwrq->disabled = 0;      /* Can't be disabled */
@@ -6910,9 +6931,10 @@ static int airo_get_retry(struct net_device *dev,
 */
static int airo_get_range(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_point *dwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_point *dwrq = &wrqu->data;
	struct airo_info *local = dev->ml_priv;
	struct iw_range *range = (struct iw_range *) extra;
	CapabilityRid cap_rid;		/* Card capability info */
@@ -7036,9 +7058,9 @@ static int airo_get_range(struct net_device *dev,
 */
static int airo_set_power(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_param *vwrq,
			  char *extra)
			  union iwreq_data *wrqu, char *extra)
{
	struct iw_param *vwrq = &wrqu->power;
	struct airo_info *local = dev->ml_priv;

	readConfigRid(local, 1);
@@ -7094,9 +7116,10 @@ static int airo_set_power(struct net_device *dev,
 */
static int airo_get_power(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_param *vwrq,
			  union iwreq_data *wrqu,
			  char *extra)
{
	struct iw_param *vwrq = &wrqu->power;
	struct airo_info *local = dev->ml_priv;
	__le16 mode;

@@ -7125,9 +7148,10 @@ static int airo_get_power(struct net_device *dev,
 */
static int airo_set_sens(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_param *vwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_param *vwrq = &wrqu->sens;
	struct airo_info *local = dev->ml_priv;

	readConfigRid(local, 1);
@@ -7144,9 +7168,10 @@ static int airo_set_sens(struct net_device *dev,
 */
static int airo_get_sens(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_param *vwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_param *vwrq = &wrqu->sens;
	struct airo_info *local = dev->ml_priv;

	readConfigRid(local, 1);
@@ -7164,9 +7189,10 @@ static int airo_get_sens(struct net_device *dev,
 */
static int airo_get_aplist(struct net_device *dev,
			   struct iw_request_info *info,
			   struct iw_point *dwrq,
			   union iwreq_data *wrqu,
			   char *extra)
{
	struct iw_point *dwrq = &wrqu->data;
	struct airo_info *local = dev->ml_priv;
	struct sockaddr *address = (struct sockaddr *) extra;
	struct iw_quality *qual;
@@ -7242,7 +7268,7 @@ static int airo_get_aplist(struct net_device *dev,
 */
static int airo_set_scan(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_point *dwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct airo_info *ai = dev->ml_priv;
@@ -7473,9 +7499,10 @@ static inline char *airo_translate_scan(struct net_device *dev,
 */
static int airo_get_scan(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_point *dwrq,
			 union iwreq_data *wrqu,
			 char *extra)
{
	struct iw_point *dwrq = &wrqu->data;
	struct airo_info *ai = dev->ml_priv;
	BSSListElement *net;
	int err = 0;
@@ -7517,7 +7544,7 @@ static int airo_get_scan(struct net_device *dev,
 */
static int airo_config_commit(struct net_device *dev,
			      struct iw_request_info *info,	/* NULL */
			      void *zwrq,			/* NULL */
			      union iwreq_data *wrqu,		/* NULL */
			      char *extra)			/* NULL */
{
	struct airo_info *local = dev->ml_priv;
@@ -7567,61 +7594,46 @@ static const struct iw_priv_args airo_private_args[] = {

static const iw_handler		airo_handler[] =
{
	(iw_handler) airo_config_commit,	/* SIOCSIWCOMMIT */
	(iw_handler) airo_get_name,		/* SIOCGIWNAME */
	(iw_handler) NULL,			/* SIOCSIWNWID */
	(iw_handler) NULL,			/* SIOCGIWNWID */
	(iw_handler) airo_set_freq,		/* SIOCSIWFREQ */
	(iw_handler) airo_get_freq,		/* SIOCGIWFREQ */
	(iw_handler) airo_set_mode,		/* SIOCSIWMODE */
	(iw_handler) airo_get_mode,		/* SIOCGIWMODE */
	(iw_handler) airo_set_sens,		/* SIOCSIWSENS */
	(iw_handler) airo_get_sens,		/* SIOCGIWSENS */
	(iw_handler) NULL,			/* SIOCSIWRANGE */
	(iw_handler) airo_get_range,		/* SIOCGIWRANGE */
	(iw_handler) NULL,			/* SIOCSIWPRIV */
	(iw_handler) NULL,			/* SIOCGIWPRIV */
	(iw_handler) NULL,			/* SIOCSIWSTATS */
	(iw_handler) NULL,			/* SIOCGIWSTATS */
	iw_handler_set_spy,			/* SIOCSIWSPY */
	iw_handler_get_spy,			/* SIOCGIWSPY */
	iw_handler_set_thrspy,			/* SIOCSIWTHRSPY */
	iw_handler_get_thrspy,			/* SIOCGIWTHRSPY */
	(iw_handler) airo_set_wap,		/* SIOCSIWAP */
	(iw_handler) airo_get_wap,		/* SIOCGIWAP */
	(iw_handler) NULL,			/* -- hole -- */
	(iw_handler) airo_get_aplist,		/* SIOCGIWAPLIST */
	(iw_handler) airo_set_scan,		/* SIOCSIWSCAN */
	(iw_handler) airo_get_scan,		/* SIOCGIWSCAN */
	(iw_handler) airo_set_essid,		/* SIOCSIWESSID */
	(iw_handler) airo_get_essid,		/* SIOCGIWESSID */
	(iw_handler) airo_set_nick,		/* SIOCSIWNICKN */
	(iw_handler) airo_get_nick,		/* SIOCGIWNICKN */
	(iw_handler) NULL,			/* -- hole -- */
	(iw_handler) NULL,			/* -- hole -- */
	(iw_handler) airo_set_rate,		/* SIOCSIWRATE */
	(iw_handler) airo_get_rate,		/* SIOCGIWRATE */
	(iw_handler) airo_set_rts,		/* SIOCSIWRTS */
	(iw_handler) airo_get_rts,		/* SIOCGIWRTS */
	(iw_handler) airo_set_frag,		/* SIOCSIWFRAG */
	(iw_handler) airo_get_frag,		/* SIOCGIWFRAG */
	(iw_handler) airo_set_txpow,		/* SIOCSIWTXPOW */
	(iw_handler) airo_get_txpow,		/* SIOCGIWTXPOW */
	(iw_handler) airo_set_retry,		/* SIOCSIWRETRY */
	(iw_handler) airo_get_retry,		/* SIOCGIWRETRY */
	(iw_handler) airo_set_encode,		/* SIOCSIWENCODE */
	(iw_handler) airo_get_encode,		/* SIOCGIWENCODE */
	(iw_handler) airo_set_power,		/* SIOCSIWPOWER */
	(iw_handler) airo_get_power,		/* SIOCGIWPOWER */
	(iw_handler) NULL,			/* -- hole -- */
	(iw_handler) NULL,			/* -- hole -- */
	(iw_handler) NULL,			/* SIOCSIWGENIE */
	(iw_handler) NULL,			/* SIOCGIWGENIE */
	(iw_handler) airo_set_auth,		/* SIOCSIWAUTH */
	(iw_handler) airo_get_auth,		/* SIOCGIWAUTH */
	(iw_handler) airo_set_encodeext,	/* SIOCSIWENCODEEXT */
	(iw_handler) airo_get_encodeext,	/* SIOCGIWENCODEEXT */
	(iw_handler) NULL,			/* SIOCSIWPMKSA */
	IW_HANDLER(SIOCSIWCOMMIT,	airo_config_commit),
	IW_HANDLER(SIOCGIWNAME,		airo_get_name),
	IW_HANDLER(SIOCSIWFREQ,		airo_set_freq),
	IW_HANDLER(SIOCGIWFREQ,		airo_get_freq),
	IW_HANDLER(SIOCSIWMODE,		airo_set_mode),
	IW_HANDLER(SIOCGIWMODE,		airo_get_mode),
	IW_HANDLER(SIOCSIWSENS,		airo_set_sens),
	IW_HANDLER(SIOCGIWSENS,		airo_get_sens),
	IW_HANDLER(SIOCGIWRANGE,	airo_get_range),
	IW_HANDLER(SIOCSIWSPY,		iw_handler_set_spy),
	IW_HANDLER(SIOCGIWSPY,		iw_handler_get_spy),
	IW_HANDLER(SIOCSIWTHRSPY,	iw_handler_set_thrspy),
	IW_HANDLER(SIOCGIWTHRSPY,	iw_handler_get_thrspy),
	IW_HANDLER(SIOCSIWAP,		airo_set_wap),
	IW_HANDLER(SIOCGIWAP,		airo_get_wap),
	IW_HANDLER(SIOCGIWAPLIST,	airo_get_aplist),
	IW_HANDLER(SIOCSIWSCAN,		airo_set_scan),
	IW_HANDLER(SIOCGIWSCAN,		airo_get_scan),
	IW_HANDLER(SIOCSIWESSID,	airo_set_essid),
	IW_HANDLER(SIOCGIWESSID,	airo_get_essid),
	IW_HANDLER(SIOCSIWNICKN,	airo_set_nick),
	IW_HANDLER(SIOCGIWNICKN,	airo_get_nick),
	IW_HANDLER(SIOCSIWRATE,		airo_set_rate),
	IW_HANDLER(SIOCGIWRATE,		airo_get_rate),
	IW_HANDLER(SIOCSIWRTS,		airo_set_rts),
	IW_HANDLER(SIOCGIWRTS,		airo_get_rts),
	IW_HANDLER(SIOCSIWFRAG,		airo_set_frag),
	IW_HANDLER(SIOCGIWFRAG,		airo_get_frag),
	IW_HANDLER(SIOCSIWTXPOW,	airo_set_txpow),
	IW_HANDLER(SIOCGIWTXPOW,	airo_get_txpow),
	IW_HANDLER(SIOCSIWRETRY,	airo_set_retry),
	IW_HANDLER(SIOCGIWRETRY,	airo_get_retry),
	IW_HANDLER(SIOCSIWENCODE,	airo_set_encode),
	IW_HANDLER(SIOCGIWENCODE,	airo_get_encode),
	IW_HANDLER(SIOCSIWPOWER,	airo_set_power),
	IW_HANDLER(SIOCGIWPOWER,	airo_get_power),
	IW_HANDLER(SIOCSIWAUTH,		airo_set_auth),
	IW_HANDLER(SIOCGIWAUTH,		airo_get_auth),
	IW_HANDLER(SIOCSIWENCODEEXT,	airo_set_encodeext),
	IW_HANDLER(SIOCGIWENCODEEXT,	airo_get_encodeext),
};

/* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here.