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

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.org


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e129d6c9
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -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;
+4 −4
Original line number Diff line number Diff line
@@ -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 */
+10 −13
Original line number Diff line number Diff line
@@ -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
+3 −2
Original line number Diff line number Diff line
@@ -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 */
+2 −2
Original line number Diff line number Diff line
@@ -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 */
Loading