Page MenuHomeFreeBSD

D31265.id92627.diff
No OneTemporary

D31265.id92627.diff

Index: sys/kern/kern_sysctl.c
===================================================================
--- sys/kern/kern_sysctl.c
+++ sys/kern/kern_sysctl.c
@@ -122,6 +122,7 @@
/* Root list */
struct sysctl_oid_list sysctl__children = SLIST_HEAD_INITIALIZER(&sysctl__children);
+static char* sysctl_escape_name(const char*);
static int sysctl_remove_oid_locked(struct sysctl_oid *oidp, int del,
int recurse);
static int sysctl_old_kernel(struct sysctl_req *, const void *, size_t);
@@ -747,6 +748,47 @@
return (error);
}
+/*
+ * Duplicate the provided string, escaping any illegal characters. The result
+ * must be freed when no longer in use.
+ *
+ * The list of illegal characters is ".".
+ */
+static char*
+sysctl_escape_name(const char* orig)
+{
+ int i, s = 0, d = 0, nillegals = 0, len = 1;
+ char *new;
+
+ /* First count the number of illegal characters */
+ for (i = 0; orig[i] != '\0'; i++) {
+ len++;
+ if (orig[i] == '.')
+ nillegals++;
+ }
+
+ /* Allocate storage for new string */
+ new = malloc(len + 2 * nillegals, M_SYSCTLOID, M_WAITOK);
+
+ /* Copy the name, escaping characters as we go */
+ while (orig[s] != '\0') {
+ if (orig[s] == '.') {
+ /* %25 is the hexadecimal representation of '.' */
+ new[d++] = '%';
+ new[d++] = '2';
+ new[d++] = '5';
+ s++;
+ } else {
+ new[d++] = orig[s++];
+ }
+ }
+
+ /* Finally, nul-terminate */
+ new[d] = '\0';
+
+ return (new);
+}
+
static int
sysctl_remove_oid_locked(struct sysctl_oid *oidp, int del, int recurse)
{
@@ -828,14 +870,17 @@
const char *label)
{
struct sysctl_oid *oidp;
+ char *escaped;
/* You have to hook up somewhere.. */
if (parent == NULL)
return(NULL);
+ escaped = sysctl_escape_name(name);
/* Check if the node already exists, otherwise create it */
SYSCTL_WLOCK();
- oidp = sysctl_find_oidname(name, parent);
+ oidp = sysctl_find_oidname(escaped, parent);
if (oidp != NULL) {
+ free(escaped, M_SYSCTLOID);
if ((oidp->oid_kind & CTLTYPE) == CTLTYPE_NODE) {
oidp->oid_refcnt++;
/* Update the context */
@@ -854,7 +899,7 @@
SLIST_INIT(&oidp->oid_children);
oidp->oid_number = number;
oidp->oid_refcnt = 1;
- oidp->oid_name = strdup(name, M_SYSCTLOID);
+ oidp->oid_name = escaped;
oidp->oid_handler = handler;
oidp->oid_kind = CTLFLAG_DYN | kind;
oidp->oid_arg1 = arg1;

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 16, 6:22 PM (11 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29781156
Default Alt Text
D31265.id92627.diff (2 KB)

Event Timeline