Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148098666
D31265.id92627.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D31265.id92627.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D31265: Escape any '.' characters in sysctl node names
Attached
Detach File
Event Timeline
Log In to Comment