Files
linux/include/linux
Al Viro b4c0353693 sanitize handling of nd->last_type, kill LAST_BIND
->last_type values are set in 3 places: path_init() (sets to LAST_ROOT),
link_path_walk (LAST_NORM/DOT/DOTDOT) and pick_link (LAST_BIND).

The are checked in walk_component(), lookup_last() and do_last().
They also get copied to the caller by filename_parentat().  In the last
3 cases the value is what we had at the return from link_path_walk().
In case of walk_component() it's either directly downstream from
assignment in link_path_walk() or, when called by lookup_last(), the
value we have at the return from link_path_walk().

The value at the entry into link_path_walk() can survive to return only
if the pathname contains nothing but slashes.  Note that pick_link()
never returns such - pure jumps are handled directly.  So for the calls
of link_path_walk() for trailing symlinks it does not matter what value
had been there at the entry; the value at the return won't depend upon it.

There are 3 call chains that might have pick_link() storing LAST_BIND:

1) pick_link() from step_into() from walk_component() from
link_path_walk().  In that case we will either be parsing the next
component immediately after return into link_path_walk(), which will
overwrite the ->last_type before anyone has a chance to look at it,
or we'll fail, in which case nobody will be looking at ->last_type at all.

2) pick_link() from step_into() from walk_component() from lookup_last().
The value is never looked at due to the above; it won't affect the value
seen at return from any link_path_walk().

3) pick_link() from step_into() from do_last().  Ditto.

In other words, assignemnt in pick_link() is pointless, and so is
LAST_BIND itself; nothing ever looks at that value.  Kill it off.
And make link_path_walk() _always_ assign ->last_type - in the only
case when the value at the entry might survive to the return that value
is always LAST_ROOT, inherited from path_init().  Move that assignment
from path_init() into the beginning of link_path_walk(), to consolidate
the things.

Historical note: LAST_BIND used to be used for the kludge with trailing
pure jump symlinks (extra iteration through the top-level loop).
No point keeping it anymore...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2020-03-13 21:08:19 -04:00
..
2019-08-09 09:15:05 +02:00
2019-09-16 09:56:27 -07:00
2019-12-11 09:12:38 +01:00
2019-11-12 11:43:29 -05:00
2020-01-27 14:35:32 +01:00
2020-01-23 12:37:18 +00:00
2020-02-04 03:05:26 +00:00
2020-02-04 03:05:26 +00:00
2019-11-26 10:26:26 +01:00
2020-01-23 00:35:50 +01:00
2019-10-09 19:33:43 -07:00
2019-12-03 11:20:37 +01:00
2019-09-05 19:52:33 -06:00
2020-01-27 11:09:31 +01:00
2020-01-17 16:48:07 -08:00
2020-01-18 09:19:18 -05:00
2020-01-13 21:48:42 +01:00
2019-11-20 09:40:10 +01:00
2019-12-01 12:59:06 -08:00
2019-09-05 11:40:54 +02:00
2019-07-05 21:34:50 +02:00
2019-06-26 13:19:46 -07:00
2019-10-04 12:31:46 -07:00
2019-10-15 13:34:25 +02:00
2019-11-11 09:02:56 +01:00
2019-12-04 19:44:14 -08:00
2020-01-31 17:33:54 +00:00
2019-12-11 09:12:38 +01:00
2019-09-02 11:43:54 +01:00
2019-10-15 20:40:06 -07:00
2019-09-05 12:32:05 +02:00
2020-02-04 07:24:48 +00:00
2019-12-09 10:55:03 +01:00
2019-08-14 15:30:35 +02:00
2019-08-08 09:09:25 +02:00
2019-11-14 19:06:47 -08:00
2020-01-15 10:54:33 -05:00
2020-01-14 12:20:48 +01:00
2019-12-11 16:37:02 +08:00
2019-11-13 19:09:47 +08:00
2020-01-16 17:09:18 +01:00
2020-01-15 16:30:28 +00:00
2020-01-29 17:00:02 -06:00
2019-07-16 19:23:25 -07:00
2019-12-06 10:47:28 +01:00
2020-01-13 18:16:43 -08:00
2020-01-10 14:00:58 -08:00
2020-01-24 10:24:31 -08:00
2020-01-24 10:24:31 -08:00
2019-11-14 13:07:48 +08:00
2019-10-10 14:55:24 -07:00
2020-02-04 03:05:24 +00:00
2019-11-13 12:15:34 -08:00
2020-01-13 18:31:48 -08:00
2020-02-04 03:05:26 +00:00
2019-11-13 00:33:21 +11:00
2019-08-30 07:27:17 -07:00
2019-08-01 20:51:22 +02:00
2019-07-31 19:03:35 +02:00
2020-01-14 12:20:48 +01:00
2019-11-14 12:20:02 +08:00
2020-01-17 22:33:37 -05:00