sysctl: fix bug 3894 _for real_.

This commit is contained in:
Denis Vlasenko 2008-10-15 09:43:35 +00:00
parent 81944c9e92
commit e915a1a410

View File

@ -234,19 +234,30 @@ static int sysctl_display_all(const char *path)
static void sysctl_dots_to_slashes(char *name) static void sysctl_dots_to_slashes(char *name)
{ {
char *cptr = name; char *cptr, *last_good;
char *end = name + strlen(name) - 1;
/* Example from bug 3894: /* Example from bug 3894:
* net.ipv4.conf.eth0.100.mc_forwarding -> * net.ipv4.conf.eth0.100.mc_forwarding ->
* net/ipv4/conf/eth0.100/mc_forwarding */ * net/ipv4/conf/eth0.100/mc_forwarding. NB:
while (*cptr != '\0') { * net/ipv4/conf/eth0/mc_forwarding *also exists*,
* therefore we must start from the end, and if
* we replaced even one . -> /, start over again,
* but never replace dots before the position
* where replacement occurred. */
last_good = name - 1;
again:
cptr = end;
while (cptr > last_good) {
if (*cptr == '.') { if (*cptr == '.') {
*cptr = '\0'; *cptr = '\0';
if (access(name, F_OK) == 0) if (access(name, F_OK) == 0) {
*cptr = '/'; *cptr = '/';
else last_good = cptr;
goto again;
}
*cptr = '.'; *cptr = '.';
} }
cptr++; cptr--;
} }
} /* end sysctl_dots_to_slashes() */ } /* end sysctl_dots_to_slashes() */