Вы можете посчитать количество компонентов, которые соответствуют "..", ".",:
for (p = strtok(path, "/"); p; p = strtok(NULL, "/")) {
if (strcmp(p, "..") == 0) {
counters[Back]++;
} else if (strcmp(p, ".") == 0) {
counters[Self]++;
} else if (*p) { /* ignore /// runs */
counters[Forw]++;
}
escaped |= (counters[Back] > counters[Forw]);
}
Экранированный фиксирует, пытался ли путь выйти из дерева подтекущий рабочий каталог.Вероятно, стоит использовать специальный регистр, начинающийся с «/», в качестве выхода.
Существуют и другие подходы, которые декодируют абсолютное пространство пути, но могут привести к избыточному охвату (imho, обычный отказ системы).Я, как владелец, мог бы хотеть, чтобы ваша программа принимала имена путей, которые выходят из вашего пространства имен, по крайней мере, ограниченным образом.Симлинки работают хорошо для этого, не требуют специального административного контроля и т. Д. ... Если ваша программа предотвращает такой тип конфигурации, то ее утилита уменьшается.