Kenneth Westerback <kwesterb...@gmail.com> wrote:

> Looks correct to me. The value returned by get_ucomnames() is only
> passed to find_ucom() where it is checked against NULL.

Alternative diff in the kernel, *in addition* to the other diff.

On a ucom-supporting kernel, if there are no matching devices the
sysctl returns the empty string.

The correct value for the sysctl node should be "no ucom translations 
information".

So lack of support should return the empty string, not EINVAL. From
sysctl(2), EINVAL means either of these two conditions:

     [EINVAL]           The name array is less than two or greater than
                        CTL_MAXNAME.

     [EINVAL]           A non-null newp pointer is given and its specified
                        length in newlen is too large or too small.

Neither of them apply.  It's a made-up errno.  Maybe some other error
would be more suitable, but empty string works just as well.

Compile tested on GENERIC and RAMDISK, I did not try more than that.

Index: kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
diff -u -p -u -r1.424 kern_sysctl.c
--- kern_sysctl.c       19 Jan 2024 01:43:27 -0000      1.424
+++ kern_sysctl.c       10 Feb 2024 03:39:16 -0000
@@ -771,14 +771,13 @@ hw_sysctl(int *name, u_int namelen, void
        case HW_ALLOWPOWERDOWN:
                return (sysctl_securelevel_int(oldp, oldlenp, newp, newlen,
                    &allowpowerdown));
-#if NUCOM > 0
        case HW_UCOMNAMES: {
-               const char *str = sysctl_ucominit();
-               if (str == NULL)
-                       return EINVAL;
+               const char *str = "";
+#if NUCOM > 0
+               str = sysctl_ucominit();
+#endif /* NUCOM > 0 */
                return (sysctl_rdstring(oldp, oldlenp, newp, str));
        }
-#endif /* NUCOM > 0 */
 #ifdef __HAVE_CPU_TOPOLOGY
        case HW_SMT:
                return (sysctl_hwsmt(oldp, oldlenp, newp, newlen));

Reply via email to