Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F103514719
D17282.id61088.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D17282.id61088.diff
View Options
Index: lib/libc/gen/sysctlbyname.c
===================================================================
--- lib/libc/gen/sysctlbyname.c
+++ lib/libc/gen/sysctlbyname.c
@@ -1,11 +1,29 @@
-/*
- * ----------------------------------------------------------------------------
- * "THE BEER-WARE LICENSE" (Revision 42):
- * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you
- * can do whatever you want with this stuff. If we meet some day, and you think
- * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
- * ----------------------------------------------------------------------------
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2019 Pawel Biernacki, Mysterious Code Ltd.
*
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
*/
#include <sys/cdefs.h>
@@ -13,16 +31,17 @@
#include <sys/types.h>
#include <sys/sysctl.h>
+#include <string.h>
+extern int __sysctlbyname(const char *name, size_t namelen, void *oldp,
+ size_t *oldlenp, const void *newp, size_t newlen);
+
int
sysctlbyname(const char *name, void *oldp, size_t *oldlenp,
const void *newp, size_t newlen)
{
- int real_oid[CTL_MAXNAME+2];
- size_t oidlen;
+ size_t namelen;
- oidlen = sizeof(real_oid) / sizeof(int);
- if (sysctlnametomib(name, real_oid, &oidlen) < 0)
- return (-1);
- return (sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen));
+ namelen = strlen(name);
+ return (__sysctlbyname(name, namelen, oldp, oldlenp, newp, newlen));
}
Index: sys/compat/freebsd32/freebsd32_misc.c
===================================================================
--- sys/compat/freebsd32/freebsd32_misc.c
+++ sys/compat/freebsd32/freebsd32_misc.c
@@ -121,6 +121,8 @@
FEATURE(compat_freebsd_32bit, "Compatible with 32-bit FreeBSD");
+MALLOC_DECLARE(M_SYSCTL);
+
#ifdef __amd64__
CTASSERT(sizeof(struct timeval32) == 8);
CTASSERT(sizeof(struct timespec32) == 8);
@@ -2256,6 +2258,59 @@
}
int
+freebsd32___sysctlbyname(struct thread *td, struct
+ freebsd32___sysctlbyname_args *uap)
+{
+ int oid[CTL_MAXNAME];
+#define NAMEBUFLEN 16
+ char namebuf[NAMEBUFLEN];
+ char *name;
+ size_t namelen, oidlen, oldlen, rv;
+ int error;
+ uint32_t tmp;
+
+ namelen = uap->namelen;
+ if (namelen > MAXPATHLEN || namelen == 0)
+ return (EINVAL);
+
+ name = namebuf;
+ if (namelen > NAMEBUFLEN)
+ name = malloc(namelen, M_SYSCTL, M_WAITOK);
+ error = copyin(uap->name, name, namelen);
+ if (error != 0)
+ goto out;
+
+ oid[0] = 0;
+ oid[1] = 3;
+ oidlen = sizeof(oid);
+ error = kernel_sysctl(td, oid, 2, oid, &oidlen, (void *)name, namelen,
+ &rv, 0);
+ if (error != 0)
+ goto out;
+
+ if (uap->oldlenp != NULL) {
+ error = fueword32(uap->oldlenp, &tmp);
+ oldlen = tmp;
+ } else {
+ oldlen = 0;
+ }
+ if (error != 0)
+ goto out;
+ error = userland_sysctl(td, oid, rv / sizeof(int), uap->old,
+ &oldlen, 1, (void *)uap->new, uap->newlen, &rv, 0);
+ if (error != 0)
+ goto out;
+ if (uap->oldlenp != NULL)
+ suword32(uap->oldlenp, rv);
+
+out:
+ if (namelen > NAMEBUFLEN)
+ free(name, M_SYSCTL);
+ return (error);
+#undef NAMEBUF
+}
+
+int
freebsd32_jail(struct thread *td, struct freebsd32_jail_args *uap)
{
uint32_t version;
Index: sys/compat/freebsd32/syscalls.master
===================================================================
--- sys/compat/freebsd32/syscalls.master
+++ sys/compat/freebsd32/syscalls.master
@@ -1150,5 +1150,8 @@
569 AUE_NULL NOPROTO { ssize_t copy_file_range(int infd, \
off_t *inoffp, int outfd, off_t *outoffp, \
size_t len, unsigned int flags); }
+570 AUE_SYSCTL STD { int freebsd32___sysctlbyname(const char *name, \
+ size_t namelen, void *old, uint32_t *oldlenp, \
+ void *new, size_t newlen); }
; vim: syntax=off
Index: sys/kern/kern_sysctl.c
===================================================================
--- sys/kern/kern_sysctl.c
+++ sys/kern/kern_sysctl.c
@@ -79,7 +79,8 @@
#include <vm/vm.h>
#include <vm/vm_extern.h>
-static MALLOC_DEFINE(M_SYSCTL, "sysctl", "sysctl internal magic");
+/* Can't be static, used by freebsd32 compat. */
+MALLOC_DEFINE(M_SYSCTL, "sysctl", "sysctl internal magic");
static MALLOC_DEFINE(M_SYSCTLOID, "sysctloid", "sysctl dynamic oids");
static MALLOC_DEFINE(M_SYSCTLTMP, "sysctltmp", "sysctl temp output buffer");
@@ -2145,6 +2146,59 @@
return (error);
}
+#ifndef _SYS_SYSPROTO_H_
+struct __sysctlbyname_args {
+ const char *name;
+ size_t namelen;
+ void *old;
+ size_t *oldlenp;
+ void *new;
+ size_t newlen;
+};
+#endif
+int
+sys___sysctlbyname(struct thread *td, struct __sysctlbyname_args *uap)
+{
+ int oid[CTL_MAXNAME];
+#define NAMEBUFLEN 16
+ char namebuf[NAMEBUFLEN];
+ char *name;
+ size_t namelen, oidlen, rv;
+ int error;
+
+ namelen = uap->namelen;
+ if (namelen > MAXPATHLEN || namelen == 0)
+ return (EINVAL);
+
+ name = namebuf;
+ if (namelen > NAMEBUFLEN)
+ name = malloc(namelen, M_SYSCTL, M_WAITOK);
+ error = copyin(uap->name, name, namelen);
+ if (error != 0)
+ goto out;
+
+ oid[0] = 0;
+ oid[1] = 3;
+ oidlen = sizeof(oid);
+ error = kernel_sysctl(td, oid, 2, oid, &oidlen, (void *)name, namelen,
+ &rv, 0);
+ if (error != 0)
+ goto out;
+
+ error = userland_sysctl(td, oid, rv / sizeof(int), uap->old, uap->oldlenp,
+ 0, (void *)uap->new, uap->newlen, &rv, 0);
+ if (error != 0)
+ goto out;
+ if (uap->oldlenp != NULL)
+ error = copyout(&rv, uap->oldlenp, sizeof(rv));
+
+out:
+ if (namelen > NAMEBUFLEN)
+ free(name, M_SYSCTL);
+ return (error);
+#undef NAMEBUFLEN
+}
+
/*
* This is used from various compatibility syscalls too. That's why name
* must be in kernel space.
Index: sys/kern/syscalls.master
===================================================================
--- sys/kern/syscalls.master
+++ sys/kern/syscalls.master
@@ -3185,6 +3185,15 @@
unsigned int flags
);
}
+570 AUE_SYSCTL STD {
+ int __sysctlbyname(
+ _In_reads_(namelen) const char *name,
+ size_t namelen,
+ _Out_writes_bytes_opt_(*oldlenp) void *old,
+ _Inout_opt_ size_t *oldlenp,
+ _In_reads_bytes_opt_(newlen) void *new,
+ size_t newlen);
+ }
; Please copy any additions and changes to the following compatability tables:
; sys/compat/freebsd32/syscalls.master
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Nov 26, 11:37 PM (16 h, 46 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14872951
Default Alt Text
D17282.id61088.diff (7 KB)
Attached To
Mode
D17282: new syscall: __sysctlbyname
Attached
Detach File
Event Timeline
Log In to Comment