Commit aabdedf4 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Takashi Iwai

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: 8cc72361 ("ALSA: SB X-Fi driver merge")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20240213101303.460008-1-arnd@kernel.orgSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e129d6c9
......@@ -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 @@ int amixer_mgr_create(struct hw *hw, struct amixer_mgr **ramixer_mgr)
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 @@ int sum_mgr_create(struct hw *hw, struct sum_mgr **rsum_mgr)
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;
......
......@@ -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 */
......@@ -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
......
......@@ -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 @@ int daio_mgr_create(struct hw *hw, struct daio_mgr **rdaio_mgr)
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 */
......
......@@ -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 */
......@@ -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 @@ int src_mgr_create(struct hw *hw, struct src_mgr **rsrc_mgr)
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 @@ int srcimp_mgr_create(struct hw *hw, struct srcimp_mgr **rsrcimp_mgr)
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 */
......
......@@ -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 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment