Message ID | 20210924105733.GA78013@embeddedor (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [next] firewire: cdev: Fix function cast error | expand |
On September 24, 2021 3:57:33 AM PDT, "Gustavo A. R. Silva" <gustavoars@kernel.org> wrote: >Fix the following function cast error when building with >-Wcast-function-type: > >drivers/firewire/core-cdev.c: In function ‘ioctl_create_iso_context’: >drivers/firewire/core-cdev.c:985:8: error: cast between incompatible function types from ‘void (*)(struct fw_iso_context *, dma_addr_t, void *)’ {aka ‘void (*)(struct fw_iso_context *, long long unsigned int, void *)’} to ‘void (*)(struct fw_iso_context *, u32, size_t, void *, void *)’ {aka ‘void (*)(struct fw_iso_context *, unsigned int, long unsigned int, void *, void *)’} [-Werror=cast-function-type] > 985 | cb = (fw_iso_callback_t)iso_mc_callback; > | ^ >cc1: all warnings being treated as errors > >This helps with the ongoing efforts to globally enable -Wcast-function-type, >so when Control Flow Integrity checking lands in the kernel, incompatible >function type casting doesn't interfere with it. > >Link: https://github.com/KSPP/linux/issues/20 >Link: https://github.com/KSPP/linux/issues/102 >Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> I thought this looked familiar... https://lore.kernel.org/lkml/20200530090839.7895-1-oscar.carter@gmx.com/ I think someone just needs to pick this up since it got past review, etc. -Kees >--- > drivers/firewire/core-cdev.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > >diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c >index fb6c651214f3..fd2923599667 100644 >--- a/drivers/firewire/core-cdev.c >+++ b/drivers/firewire/core-cdev.c >@@ -957,7 +957,10 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) > { > struct fw_cdev_create_iso_context *a = &arg->create_iso_context; > struct fw_iso_context *context; >- fw_iso_callback_t cb; >+ union callback { >+ fw_iso_callback_t sc; >+ fw_iso_mc_callback_t mc; >+ } cb; > int ret; > > BUILD_BUG_ON(FW_CDEV_ISO_CONTEXT_TRANSMIT != FW_ISO_CONTEXT_TRANSMIT || >@@ -970,7 +973,7 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) > if (a->speed > SCODE_3200 || a->channel > 63) > return -EINVAL; > >- cb = iso_callback; >+ cb.sc = iso_callback; > break; > > case FW_ISO_CONTEXT_RECEIVE: >@@ -978,11 +981,11 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) > a->channel > 63) > return -EINVAL; > >- cb = iso_callback; >+ cb.sc = iso_callback; > break; > > case FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL: >- cb = (fw_iso_callback_t)iso_mc_callback; >+ cb.mc = iso_mc_callback; > break; > > default: >@@ -990,7 +993,7 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) > } > > context = fw_iso_context_create(client->device->card, a->type, >- a->channel, a->speed, a->header_size, cb, client); >+ a->channel, a->speed, a->header_size, cb.sc, client); > if (IS_ERR(context)) > return PTR_ERR(context); > if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW)
On 9/24/21 07:47, Kees Cook wrote: > I thought this looked familiar... > > https://lore.kernel.org/lkml/20200530090839.7895-1-oscar.carter@gmx.com/ Oh, cool. :) > I think someone just needs to pick this up since it got past review, etc. Yeah. I can take it in my -next tree if nobody cares. Thanks -- Gustavo
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index fb6c651214f3..fd2923599667 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c @@ -957,7 +957,10 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) { struct fw_cdev_create_iso_context *a = &arg->create_iso_context; struct fw_iso_context *context; - fw_iso_callback_t cb; + union callback { + fw_iso_callback_t sc; + fw_iso_mc_callback_t mc; + } cb; int ret; BUILD_BUG_ON(FW_CDEV_ISO_CONTEXT_TRANSMIT != FW_ISO_CONTEXT_TRANSMIT || @@ -970,7 +973,7 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) if (a->speed > SCODE_3200 || a->channel > 63) return -EINVAL; - cb = iso_callback; + cb.sc = iso_callback; break; case FW_ISO_CONTEXT_RECEIVE: @@ -978,11 +981,11 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) a->channel > 63) return -EINVAL; - cb = iso_callback; + cb.sc = iso_callback; break; case FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL: - cb = (fw_iso_callback_t)iso_mc_callback; + cb.mc = iso_mc_callback; break; default: @@ -990,7 +993,7 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) } context = fw_iso_context_create(client->device->card, a->type, - a->channel, a->speed, a->header_size, cb, client); + a->channel, a->speed, a->header_size, cb.sc, client); if (IS_ERR(context)) return PTR_ERR(context); if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW)
Fix the following function cast error when building with -Wcast-function-type: drivers/firewire/core-cdev.c: In function ‘ioctl_create_iso_context’: drivers/firewire/core-cdev.c:985:8: error: cast between incompatible function types from ‘void (*)(struct fw_iso_context *, dma_addr_t, void *)’ {aka ‘void (*)(struct fw_iso_context *, long long unsigned int, void *)’} to ‘void (*)(struct fw_iso_context *, u32, size_t, void *, void *)’ {aka ‘void (*)(struct fw_iso_context *, unsigned int, long unsigned int, void *, void *)’} [-Werror=cast-function-type] 985 | cb = (fw_iso_callback_t)iso_mc_callback; | ^ cc1: all warnings being treated as errors This helps with the ongoing efforts to globally enable -Wcast-function-type, so when Control Flow Integrity checking lands in the kernel, incompatible function type casting doesn't interfere with it. Link: https://github.com/KSPP/linux/issues/20 Link: https://github.com/KSPP/linux/issues/102 Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> --- drivers/firewire/core-cdev.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)