ALSA: ctxfi: avoid casting function pointers
authorArnd Bergmann <arnd@arndb.de>
Tue, 13 Feb 2024 10:12:46 +0000 (11:12 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 13 Feb 2024 13:21:50 +0000 (14:21 +0100)
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: 8cc72361481f ("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>
sound/pci/ctxfi/ctamixer.c
sound/pci/ctxfi/ctamixer.h
sound/pci/ctxfi/ctatc.c
sound/pci/ctxfi/ctdaio.c
sound/pci/ctxfi/ctdaio.h
sound/pci/ctxfi/ctsrc.c
sound/pci/ctxfi/ctsrc.h

index d074727c3e21d3edf25f934b259e441a83738b1f..397900929aa659057bf5244154f47cd2dc56c887 100644 (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;
index 4498e6139d0efa89c797f9f259b6a58cbec97cd6..8fc017da6bda8be8604222059108a31a42001ac1 100644 (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 */
index fbdb8a3d5b8e559dba742a1cd282b14408a90d00..2a3e9d8ba7dbe71aa5222d9242e0702f0e7aa398 100644 (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
index 7fc720046ce293564e513ad78fccda687f45aa38..83aaf9441ef30f0f49cda656ff17aaf8be31859a 100644 (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 */
index bd6310f48013901ca0e562f5fe52eca386fc2c52..15147fe5f74a0b21a253d216762d1369fd5fef4f 100644 (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 */
index 4a94b4708a77e55f9ee81315b1d0f725c8cc3a33..159bd40080691715d71fb91bdedc74fe41440cc2 100644 (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 */
index 1124daf50c9bea174296ad76714b0fc8bcbf9650..e6366cc6a7ae6aaaca8ae157b86514e7e8759c2d 100644 (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 */