nss: Clean up function pointer/void * unions
authorFlorian Weimer <fweimer@redhat.com>
Mon, 17 Nov 2025 16:18:00 +0000 (17:18 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 18 Nov 2025 07:35:44 +0000 (08:35 +0100)
All our targets support casts between function pointers and void *,
so we might as well use them.

This change was largely auto-generated, with the following prompts.

@getXXbyYY_r.c Remove the use of the `fct` union and replace it by
pointer casts.

Apply the same change to ether_* getnetgrent_r getnssent_r netname
publickey .

Do not use explicit `*` in function pointer calls. Replace
`(*((lookup_function) fct))` and similar with `((lookup_function) fct)`.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
nss/ether_hton.c
nss/ether_ntoh.c
nss/getXXbyYY_r.c
nss/getnetgrent_r.c
nss/getnssent_r.c
sunrpc/netname.c
sunrpc/publickey.c

index 588828cc1eb382b390f9c7d904f9c76507ba1c29..3c5b25c537aeabc2c811752c922dc9341c80492a 100644 (file)
@@ -30,24 +30,21 @@ int
 ether_hostton (const char *hostname, struct ether_addr *addr)
 {
   nss_action_list nip;
-  union
-  {
-    lookup_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   int no_more;
   enum nss_status status = NSS_STATUS_UNAVAIL;
   struct etherent etherent;
 
-  no_more = __nss_ethers_lookup2 (&nip, "gethostton_r", NULL, &fct.ptr);
+  no_more = __nss_ethers_lookup2 (&nip, "gethostton_r", NULL, &fct);
 
   while (no_more == 0)
     {
       char buffer[1024];
 
-      status = (*fct.f) (hostname, &etherent, buffer, sizeof buffer, &errno);
+      status = ((lookup_function) fct) (hostname, &etherent, buffer,
+                                       sizeof buffer, &errno);
 
-      no_more = __nss_next2 (&nip, "gethostton_r", NULL, &fct.ptr, status, 0);
+      no_more = __nss_next2 (&nip, "gethostton_r", NULL, &fct, status, 0);
     }
 
   if (status == NSS_STATUS_SUCCESS)
index 2185b9e38600227564342210955de162cce8ed8a..207a3103f0894c133c0fa5e8c80d0ac423de3eef 100644 (file)
@@ -31,24 +31,21 @@ int
 ether_ntohost (char *hostname, const struct ether_addr *addr)
 {
   nss_action_list nip;
-  union
-  {
-    lookup_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   int no_more;
   enum nss_status status = NSS_STATUS_UNAVAIL;
   struct etherent etherent;
 
-  no_more = __nss_ethers_lookup2 (&nip, "getntohost_r", NULL, &fct.ptr);
+  no_more = __nss_ethers_lookup2 (&nip, "getntohost_r", NULL, &fct);
 
   while (no_more == 0)
     {
       char buffer[1024];
 
-      status = (*fct.f) (addr, &etherent, buffer, sizeof buffer, &errno);
+      status = ((lookup_function) fct) (addr, &etherent, buffer,
+                                       sizeof buffer, &errno);
 
-      no_more = __nss_next2 (&nip, "getntohost_r", NULL, &fct.ptr, status, 0);
+      no_more = __nss_next2 (&nip, "getntohost_r", NULL, &fct, status, 0);
     }
 
   if (status == NSS_STATUS_SUCCESS)
index 2b0735fb6a83e2ec6692829133ad1e2cbaf6982a..9f7188ab4172e120c14d30816ab630a6a78bfae0 100644 (file)
@@ -189,11 +189,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
   LOOKUP_TYPE mergegrp;
   char *mergebuf = NULL;
   char *endptr = NULL;
-  union
-  {
-    lookup_function l;
-    void *ptr;
-  } fct;
+  void *fct;
   int no_more, err;
   enum nss_status status = NSS_STATUS_UNAVAIL;
 #ifdef USE_NSCD
@@ -258,7 +254,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
 #endif
 
   no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING,
-                          REENTRANT2_NAME_STRING, &fct.ptr);
+                          REENTRANT2_NAME_STRING, &fct);
 
   while (no_more == 0)
     {
@@ -266,8 +262,9 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
       any_service = true;
 #endif
 
-      status = DL_CALL_FCT (fct.l, (ADD_VARIABLES, resbuf, buffer, buflen,
-                                   &errno H_ERRNO_VAR EXTRA_VARIABLES));
+      status = DL_CALL_FCT (((lookup_function) fct),
+                           (ADD_VARIABLES, resbuf, buffer, buflen,
+                            &errno H_ERRNO_VAR EXTRA_VARIABLES));
 
       /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the
         provided buffer is too small.  In this case we should give
@@ -337,7 +334,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
        }
 
       no_more = __nss_next2 (&nip, REENTRANT_NAME_STRING,
-                            REENTRANT2_NAME_STRING, &fct.ptr, status, 0);
+                            REENTRANT2_NAME_STRING, &fct, status, 0);
     }
   free (mergebuf);
   mergebuf = NULL;
index f5137ad078fa85271f1fd638f0e4d141113835a3..df16cfe150afb9dec97b52561175e9295ce6daf9 100644 (file)
@@ -85,11 +85,7 @@ static int
 __internal_setnetgrent_reuse (const char *group, struct __netgrent *datap,
                              int *errnop)
 {
-  union
-  {
-    enum nss_status (*f) (const char *, struct __netgrent *);
-    void *ptr;
-  } fct;
+  void *fct;
   enum nss_status status = NSS_STATUS_UNAVAIL;
   struct name_list *new_elem;
 
@@ -97,16 +93,18 @@ __internal_setnetgrent_reuse (const char *group, struct __netgrent *datap,
   endnetgrent_hook (datap);
 
   /* Cycle through all the services and run their setnetgrent functions.  */
-  int no_more = setup (&fct.ptr, &datap->nip);
+  int no_more = setup (&fct, &datap->nip);
   while (! no_more)
     {
       assert (datap->data == NULL);
 
       /* Ignore status, we force check in `__nss_next2'.  */
-      status = DL_CALL_FCT (*fct.f, (group, datap));
+      status = DL_CALL_FCT (((enum nss_status (*) (const char *,
+                                                  struct __netgrent *)) fct),
+                           (group, datap));
 
       nss_action_list old_nip = datap->nip;
-      no_more = __nss_next2 (&datap->nip, "setnetgrent", NULL, &fct.ptr,
+      no_more = __nss_next2 (&datap->nip, "setnetgrent", NULL, &fct,
                             status, 0);
 
       if (status == NSS_STATUS_SUCCESS && ! no_more)
@@ -372,11 +370,7 @@ innetgr (const char *netgroup, const char *host, const char *user,
     }
 #endif
 
-  union
-  {
-    enum nss_status (*f) (const char *, struct __netgrent *);
-    void *ptr;
-  } setfct;
+  void *setfct;
   void (*endfct) (struct __netgrent *);
   int (*getfct) (struct __netgrent *, char *, size_t, int *);
   struct __netgrent entry;
@@ -391,14 +385,16 @@ innetgr (const char *netgroup, const char *host, const char *user,
      the work during one walk through the service list.  */
   while (1)
     {
-      int no_more = setup (&setfct.ptr, &entry.nip);
+      int no_more = setup (&setfct, &entry.nip);
       while (! no_more)
        {
          assert (entry.data == NULL);
 
          /* Open netgroup.  */
-         enum nss_status status = DL_CALL_FCT (*setfct.f,
-                                               (current_group, &entry));
+         enum nss_status status
+           = DL_CALL_FCT (((enum nss_status (*) (const char *,
+                                                 struct __netgrent *))
+                           setfct), (current_group, &entry));
 
          if (status == NSS_STATUS_SUCCESS
              && (getfct = __nss_lookup_function (entry.nip, "getnetgrent_r"))
@@ -474,7 +470,7 @@ innetgr (const char *netgroup, const char *host, const char *user,
 
          /* Look for the next service.  */
          no_more = __nss_next2 (&entry.nip, "setnetgrent", NULL,
-                                &setfct.ptr, status, 0);
+                                &setfct, status, 0);
        }
 
       if (result == 0 && entry.needed_groups != NULL)
index 56258d5f09190b21c135b0f913dd3e3cb1f17f23..10166f2420be56106026fd38661c030b730ca4ed 100644 (file)
@@ -53,11 +53,7 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
              nss_action_list *last_nip, int stayopen, int *stayopen_tmp,
              int res)
 {
-  union
-  {
-    setent_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   int no_more;
 
   struct resolv_context *res_ctx = NULL;
@@ -73,7 +69,7 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
 
   /* Cycle through the services and run their `setXXent' functions until
      we find an available service.  */
-  no_more = setup (func_name, lookup_fct, &fct.ptr, nip,
+  no_more = setup (func_name, lookup_fct, &fct, nip,
                   startp, 1);
   while (! no_more)
     {
@@ -81,9 +77,9 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
       enum nss_status status;
 
       if (stayopen_tmp)
-       status = DL_CALL_FCT (fct.f, (*stayopen_tmp));
+       status = DL_CALL_FCT (((setent_function) fct), (*stayopen_tmp));
       else
-       status = DL_CALL_FCT (fct.f, (0));
+       status = DL_CALL_FCT (((setent_function) fct), (0));
 
 
       /* This is a special-case.  When [SUCCESS=merge] is in play,
@@ -95,7 +91,7 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
       if (nss_next_action (*nip, status) == NSS_ACTION_MERGE)
        no_more = 1;
       else
-       no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, status, 0);
+       no_more = __nss_next2 (nip, func_name, NULL, &fct, status, 0);
 
       if (is_last_nip)
        *last_nip = *nip;
@@ -113,11 +109,7 @@ __nss_endent (const char *func_name, db_lookup_function lookup_fct,
              nss_action_list *nip, nss_action_list *startp,
              nss_action_list *last_nip, int res)
 {
-  union
-  {
-    endent_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   int no_more;
 
   struct resolv_context *res_ctx = NULL;
@@ -132,17 +124,17 @@ __nss_endent (const char *func_name, db_lookup_function lookup_fct,
     }
 
   /* Cycle through all the services and run their endXXent functions.  */
-  no_more = setup (func_name, lookup_fct, &fct.ptr, nip, startp, 1);
+  no_more = setup (func_name, lookup_fct, &fct, nip, startp, 1);
   while (! no_more)
     {
       /* Ignore status, we force check in __NSS_NEXT.  */
-      DL_CALL_FCT (fct.f, ());
+      DL_CALL_FCT (((endent_function) fct), ());
 
       if (*nip == *last_nip)
        /* We have processed all services which were used.  */
        break;
 
-      no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, 0, 1);
+      no_more = __nss_next2 (nip, func_name, NULL, &fct, 0, 1);
     }
   *last_nip = *nip = NULL;
 
@@ -159,11 +151,7 @@ __nss_getent_r (const char *getent_func_name,
                void *resbuf, char *buffer, size_t buflen,
                void **result, int *h_errnop)
 {
-  union
-  {
-    getent_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   int no_more;
   enum nss_status status;
 
@@ -185,13 +173,13 @@ __nss_getent_r (const char *getent_func_name,
   /* Run through available functions, starting with the same function last
      run.  We will repeat each function as long as it succeeds, and then go
      on to the next service action.  */
-  no_more = setup (getent_func_name, lookup_fct, &fct.ptr, nip,
+  no_more = setup (getent_func_name, lookup_fct, &fct, nip,
                   startp, 0);
   while (! no_more)
     {
       int is_last_nip = *nip == *last_nip;
 
-      status = DL_CALL_FCT (fct.f,
+      status = DL_CALL_FCT (((getent_function) fct),
                            (resbuf, buffer, buflen, &errno, &h_errno));
 
       /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the
@@ -216,7 +204,7 @@ __nss_getent_r (const char *getent_func_name,
              && nss_next_action (*nip, status) == NSS_ACTION_MERGE)
            no_more = 1;
          else
-           no_more = __nss_next2 (nip, getent_func_name, NULL, &fct.ptr,
+           no_more = __nss_next2 (nip, getent_func_name, NULL, &fct,
                                   status, 0);
 
          if (is_last_nip)
@@ -225,20 +213,16 @@ __nss_getent_r (const char *getent_func_name,
          if (! no_more)
            {
              /* Call the `setXXent' function.  This wasn't done before.  */
-             union
-             {
-               setent_function f;
-               void *ptr;
-             } sfct;
+             void *sfct;
 
-             no_more = __nss_lookup (nip, setent_func_name, NULL, &sfct.ptr);
+             no_more = __nss_lookup (nip, setent_func_name, NULL, &sfct);
 
              if (! no_more)
                {
                  if (stayopen_tmp)
-                   status = DL_CALL_FCT (sfct.f, (*stayopen_tmp));
+                   status = DL_CALL_FCT (((setent_function) sfct), (*stayopen_tmp));
                  else
-                   status = DL_CALL_FCT (sfct.f, (0));
+                   status = DL_CALL_FCT (((setent_function) sfct), (0));
                }
              else
                status = NSS_STATUS_NOTFOUND;
index d342fb89649f164fbc19b91f90916088ec0a31aa..e2acf107a5ab5f2ac9868e37fb7385297b4ce7b5 100644 (file)
@@ -157,21 +157,18 @@ netname2user (const char *netname, uid_t * uidp, gid_t * gidp,
              int *gidlenp, gid_t * gidlist)
 {
   nss_action_list nip;
-  union
-  {
-    netname2user_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   enum nss_status status = NSS_STATUS_UNAVAIL;
   int no_more;
 
-  no_more = __nss_publickey_lookup2 (&nip, "netname2user", NULL, &fct.ptr);
+  no_more = __nss_publickey_lookup2 (&nip, "netname2user", NULL, &fct);
 
   while (!no_more)
     {
-      status = (*fct.f) (netname, uidp, gidp, gidlenp, gidlist);
+      status = ((netname2user_function) fct) (netname, uidp, gidp, gidlenp,
+                                             gidlist);
 
-      no_more = __nss_next2 (&nip, "netname2user", NULL, &fct.ptr, status, 0);
+      no_more = __nss_next2 (&nip, "netname2user", NULL, &fct, status, 0);
     }
 
   return status == NSS_STATUS_SUCCESS;
index 2480f8234ce9931ac15daab8a3bb8a87789ae93f..812cb19ca030369aed03414c3ef3dc76747bfaeb 100644 (file)
@@ -34,21 +34,17 @@ int
 getpublickey (const char *name, char *key)
 {
   nss_action_list nip;
-  union
-  {
-    public_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   enum nss_status status = NSS_STATUS_UNAVAIL;
   int no_more;
 
-  no_more = __nss_publickey_lookup2 (&nip, "getpublickey", NULL, &fct.ptr);
+  no_more = __nss_publickey_lookup2 (&nip, "getpublickey", NULL, &fct);
 
   while (! no_more)
     {
-      status = (*fct.f) (name, key, &errno);
+      status = ((public_function) fct) (name, key, &errno);
 
-      no_more = __nss_next2 (&nip, "getpublickey", NULL, &fct.ptr, status, 0);
+      no_more = __nss_next2 (&nip, "getpublickey", NULL, &fct, status, 0);
     }
 
   return status == NSS_STATUS_SUCCESS;
@@ -60,21 +56,17 @@ int
 getsecretkey (const char *name, char *key, const char *passwd)
 {
   nss_action_list nip;
-  union
-  {
-    secret_function f;
-    void *ptr;
-  } fct;
+  void *fct;
   enum nss_status status = NSS_STATUS_UNAVAIL;
   int no_more;
 
-  no_more = __nss_publickey_lookup2 (&nip, "getsecretkey", NULL, &fct.ptr);
+  no_more = __nss_publickey_lookup2 (&nip, "getsecretkey", NULL, &fct);
 
   while (! no_more)
     {
-      status = (*fct.f) (name, key, passwd, &errno);
+      status = ((secret_function) fct) (name, key, passwd, &errno);
 
-      no_more = __nss_next2 (&nip, "getsecretkey", NULL, &fct.ptr, status, 0);
+      no_more = __nss_next2 (&nip, "getsecretkey", NULL, &fct, status, 0);
     }
 
   return status == NSS_STATUS_SUCCESS;
This page took 0.104371 seconds and 5 git commands to generate.