Jump to content
Калькуляторы

Максимальная глубина вложенности symlink

Как можно узнать значение максимально допустимой вложенности символических ссылок?

В man к path_resolution читал, что вроде бы максимальная глубина 7.

Однако когда я проверял (на Debian 8) у меня получилось 40.

Share this post


Link to post
Share on other sites

смотреть в исходниках же.

 

встречный вопрос: зачем?

Share this post


Link to post
Share on other sites

В исходниках само собой.

Но хотелось бы узнать действующее значение в текущей системе.

Просто любопытство.

Share this post


Link to post
Share on other sites

А надо сделать три ссылки друг на друга по кольцу.

Share this post


Link to post
Share on other sites

Вообще-то, он на то и линк, что он один, и просто указывает на другой файл или линк.

 

Вопрос другой - сколько конкретная прикладная программа будет "терпеть" перегоняя по линкам. Я, обычно, закладываю либо 16, либо 32. Не знаю, почему так. Просто в голову пришло.

Share this post


Link to post
Share on other sites

>> Вообще-то, он на то и линк, что он один, и просто указывает на другой файл или линк.

 

[sol@sol ]$ ln -s 222 111

[sol@sol ]$ ln -s 333 222

[sol@sol ]$ ln -s 111 333

[sol@sol ]$

[sol@sol ]$ ll

lrwxrwxrwx 1 sol sol 3 июл 4 00:08 111 -> 222

lrwxrwxrwx 1 sol sol 3 июл 4 00:09 222 -> 333

lrwxrwxrwx 1 sol sol 3 июл 4 00:09 333 -> 111

[sol@sol ]$

[sol@sol ]$ cat 111

cat: 111: Слишком много уровней символьных ссылок

 

т.е. "по кругу" ездит.

Share this post


Link to post
Share on other sites

Вопрос другой - сколько конкретная прикладная программа будет "терпеть" перегоняя по линкам.

Сомневаюсь, что это делает прикладная программа.

Разрешение ссылок делает системная функция, а прикладные программы просто ее вызывают.

Циклическая зависимость приходит на ум первой, но она глубину рекурсии не покажет.

Поэтому я сделал скрипт, который генерирует цепочку симлинков, проверяя их читаемость.

Этот скрипт и показал, что в Debian 8 симлинки работают до 40 уровня, затем "Слишком много уровней".

Share this post


Link to post
Share on other sites

Вопрос другой - сколько конкретная прикладная программа будет "терпеть" перегоняя по линкам.

Сомневаюсь, что это делает прикладная программа.

Разрешение ссылок делает системная функция, а прикладные программы просто ее вызывают.

Циклическая зависимость приходит на ум первой, но она глубину рекурсии не покажет.

Поэтому я сделал скрипт, который генерирует цепочку симлинков, проверяя их читаемость.

Этот скрипт и показал, что в Debian 8 симлинки работают до 40 уровня, затем "Слишком много уровней".

 

Если программа просто открывает файл open/fopen, тогда да, файл ищет система. Если пишем под glibc, то до получения ошибки ELOOP ишем...

 

> grep param.h /usr/include/sys/param.h

#define MAXSYMLINKS 20

 

... 20 раз.

 

Если программа сама ищет "оригинал" файла по линкам - то считает сама. Хотя, по глубине TOODEEP - там другая величина.

Share this post


Link to post
Share on other sites

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/namei.c?id=v3.5#n624

 

static __always_inline int
follow_link(struct path *link, struct nameidata *nd, void **p)
{
....
if (unlikely(current->total_link_count >= 40)) {
	*p = ERR_PTR(-ELOOP); /* no ->put_link(), please */
	path_put(&nd->path);
	return -ELOOP;
}
....
}

Share this post


Link to post
Share on other sites

То есть все хард-кодом указано.

Я думал, что откуда-то из системных переменных это значение можно узнать.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this