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

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

 

Вопрос другой - сколько конкретная прикладная программа будет "терпеть" перегоняя по линкам. Я, обычно, закладываю либо 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.