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)
{
char *cptr = name;
char *cptr, *last_good;
char *end = name + strlen(name) - 1;
/* Example from bug 3894:
* net.ipv4.conf.eth0.100.mc_forwarding ->
* net/ipv4/conf/eth0.100/mc_forwarding */
while (*cptr != '\0') {
* net/ipv4/conf/eth0.100/mc_forwarding. NB:
* 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 == '.') {
*cptr = '\0';
if (access(name, F_OK) == 0)
if (access(name, F_OK) == 0) {
*cptr = '/';
else
last_good = cptr;
goto again;
}
*cptr = '.';
}
cptr++;
cptr--;
}
} /* end sysctl_dots_to_slashes() */