ALSA: ctxfi: avoid casting function pointers

This driver creates an abstraction for different components by casting function
pointers to slightly incompatible types for each one to get the correct
argument even when the caller does not know those types. This is a
bit unreliable and not allowed in combination with control flow integrity
(KCFI):

sound/pci/ctxfi/ctatc.c:115:25: error: cast from 'int (*)(struct hw *, struct src_mgr **)' to 'create_t' (aka 'int (*)(struct hw *, void **)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
  115 |         [SRC]           = { .create     = (create_t)src_mgr_create,
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~
sound/pci/ctxfi/ctatc.c:116:20: error: cast from 'int (*)(struct src_mgr *)' to 'destroy_t' (aka 'int (*)(void *)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
  116 |                             .destroy    = (destroy_t)src_mgr_destroy    },
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~
sound/pci/ctxfi/ctatc.c:117:27: error: cast from 'int (*)(struct hw *, struct srcimp_mgr **)' to 'create_t' (aka 'int (*)(struct hw *, void **)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
  117 |         [SRCIMP]        = { .create     = (create_t)srcimp_mgr_create,
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
sound/pci/ctxfi/ctatc.c:118:20: error: cast from 'int (*)(struct srcimp_mgr *)' to 'destroy_t' (aka 'int (*)(void *)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
  118 |                             .destroy    = (destroy_t)srcimp_mgr_destroy },
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Change these to always pass void pointers and move the abstraction one level
down.

Fixes: 8cc7236148 ("ALSA: SB X-Fi driver merge")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20240213101303.460008-1-arnd@kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Arnd Bergmann 2024-02-13 11:12:46 +01:00 committed by Takashi Iwai
parent e129d6c9ac
commit aabdedf4d2
7 changed files with 35 additions and 33 deletions

View File

@ -292,7 +292,7 @@ static int put_amixer_rsc(struct amixer_mgr *mgr, struct amixer *amixer)
return 0;
}
int amixer_mgr_create(struct hw *hw, struct amixer_mgr **ramixer_mgr)
int amixer_mgr_create(struct hw *hw, void **ramixer_mgr)
{
int err;
struct amixer_mgr *amixer_mgr;
@ -321,8 +321,9 @@ error:
return err;
}
int amixer_mgr_destroy(struct amixer_mgr *amixer_mgr)
int amixer_mgr_destroy(void *ptr)
{
struct amixer_mgr *amixer_mgr = ptr;
rsc_mgr_uninit(&amixer_mgr->mgr);
kfree(amixer_mgr);
return 0;
@ -446,7 +447,7 @@ static int put_sum_rsc(struct sum_mgr *mgr, struct sum *sum)
return 0;
}
int sum_mgr_create(struct hw *hw, struct sum_mgr **rsum_mgr)
int sum_mgr_create(struct hw *hw, void **rsum_mgr)
{
int err;
struct sum_mgr *sum_mgr;
@ -475,8 +476,9 @@ error:
return err;
}
int sum_mgr_destroy(struct sum_mgr *sum_mgr)
int sum_mgr_destroy(void *ptr)
{
struct sum_mgr *sum_mgr = ptr;
rsc_mgr_uninit(&sum_mgr->mgr);
kfree(sum_mgr);
return 0;

View File

@ -43,8 +43,8 @@ struct sum_mgr {
};
/* Constructor and destructor of daio resource manager */
int sum_mgr_create(struct hw *hw, struct sum_mgr **rsum_mgr);
int sum_mgr_destroy(struct sum_mgr *sum_mgr);
int sum_mgr_create(struct hw *hw, void **ptr);
int sum_mgr_destroy(void *ptr);
/* Define the descriptor of a amixer resource */
struct amixer_rsc_ops;
@ -89,7 +89,7 @@ struct amixer_mgr {
};
/* Constructor and destructor of amixer resource manager */
int amixer_mgr_create(struct hw *hw, struct amixer_mgr **ramixer_mgr);
int amixer_mgr_destroy(struct amixer_mgr *amixer_mgr);
int amixer_mgr_create(struct hw *hw, void **ramixer_mgr);
int amixer_mgr_destroy(void *amixer_mgr);
#endif /* CTAMIXER_H */

View File

@ -105,23 +105,20 @@ static struct {
.public_name = "Mixer"}
};
typedef int (*create_t)(struct hw *, void **);
typedef int (*destroy_t)(void *);
static struct {
int (*create)(struct hw *hw, void **rmgr);
int (*destroy)(void *mgr);
} rsc_mgr_funcs[NUM_RSCTYP] = {
[SRC] = { .create = (create_t)src_mgr_create,
.destroy = (destroy_t)src_mgr_destroy },
[SRCIMP] = { .create = (create_t)srcimp_mgr_create,
.destroy = (destroy_t)srcimp_mgr_destroy },
[AMIXER] = { .create = (create_t)amixer_mgr_create,
.destroy = (destroy_t)amixer_mgr_destroy },
[SUM] = { .create = (create_t)sum_mgr_create,
.destroy = (destroy_t)sum_mgr_destroy },
[DAIO] = { .create = (create_t)daio_mgr_create,
.destroy = (destroy_t)daio_mgr_destroy }
[SRC] = { .create = src_mgr_create,
.destroy = src_mgr_destroy },
[SRCIMP] = { .create = srcimp_mgr_create,
.destroy = srcimp_mgr_destroy },
[AMIXER] = { .create = amixer_mgr_create,
.destroy = amixer_mgr_destroy },
[SUM] = { .create = sum_mgr_create,
.destroy = sum_mgr_destroy },
[DAIO] = { .create = daio_mgr_create,
.destroy = daio_mgr_destroy }
};
static int

View File

@ -684,7 +684,7 @@ static int daio_mgr_commit_write(struct daio_mgr *mgr)
return 0;
}
int daio_mgr_create(struct hw *hw, struct daio_mgr **rdaio_mgr)
int daio_mgr_create(struct hw *hw, void **rdaio_mgr)
{
int err, i;
struct daio_mgr *daio_mgr;
@ -738,8 +738,9 @@ error1:
return err;
}
int daio_mgr_destroy(struct daio_mgr *daio_mgr)
int daio_mgr_destroy(void *ptr)
{
struct daio_mgr *daio_mgr = ptr;
unsigned long flags;
/* free daio input mapper list */

View File

@ -115,7 +115,7 @@ struct daio_mgr {
};
/* Constructor and destructor of daio resource manager */
int daio_mgr_create(struct hw *hw, struct daio_mgr **rdaio_mgr);
int daio_mgr_destroy(struct daio_mgr *daio_mgr);
int daio_mgr_create(struct hw *hw, void **ptr);
int daio_mgr_destroy(void *ptr);
#endif /* CTDAIO_H */

View File

@ -540,7 +540,7 @@ static int src_mgr_commit_write(struct src_mgr *mgr)
return 0;
}
int src_mgr_create(struct hw *hw, struct src_mgr **rsrc_mgr)
int src_mgr_create(struct hw *hw, void **rsrc_mgr)
{
int err, i;
struct src_mgr *src_mgr;
@ -580,8 +580,9 @@ error1:
return err;
}
int src_mgr_destroy(struct src_mgr *src_mgr)
int src_mgr_destroy(void *ptr)
{
struct src_mgr *src_mgr = ptr;
rsc_mgr_uninit(&src_mgr->mgr);
kfree(src_mgr);
@ -821,7 +822,7 @@ static int srcimp_imap_delete(struct srcimp_mgr *mgr, struct imapper *entry)
return err;
}
int srcimp_mgr_create(struct hw *hw, struct srcimp_mgr **rsrcimp_mgr)
int srcimp_mgr_create(struct hw *hw, void **rsrcimp_mgr)
{
int err;
struct srcimp_mgr *srcimp_mgr;
@ -866,8 +867,9 @@ error1:
return err;
}
int srcimp_mgr_destroy(struct srcimp_mgr *srcimp_mgr)
int srcimp_mgr_destroy(void *ptr)
{
struct srcimp_mgr *srcimp_mgr = ptr;
unsigned long flags;
/* free src input mapper list */

View File

@ -139,10 +139,10 @@ struct srcimp_mgr {
};
/* Constructor and destructor of SRC resource manager */
int src_mgr_create(struct hw *hw, struct src_mgr **rsrc_mgr);
int src_mgr_destroy(struct src_mgr *src_mgr);
int src_mgr_create(struct hw *hw, void **ptr);
int src_mgr_destroy(void *ptr);
/* Constructor and destructor of SRCIMP resource manager */
int srcimp_mgr_create(struct hw *hw, struct srcimp_mgr **rsrc_mgr);
int srcimp_mgr_destroy(struct srcimp_mgr *srcimp_mgr);
int srcimp_mgr_create(struct hw *hw, void **ptr);
int srcimp_mgr_destroy(void *ptr);
#endif /* CTSRC_H */