symlink: limit symlink depth to avoid following cyclical links
/* msdn: There is a maximum of 31 reparse points (and * therefore symbolic links) allowed in a particular path. */ #define NFS41_MAX_SYMLINK_DEPTH 31 also added checks for the return value of nfs41_symlink_target() on open/link/rename Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
This commit is contained in:
parent
59526ba9d8
commit
870b389e8f
4 changed files with 41 additions and 0 deletions
|
|
@ -237,11 +237,22 @@ int handle_open(nfs41_upcall *upcall)
|
|||
&state->path, &state->parent, &state->file, &info, &state->session);
|
||||
|
||||
if (status == ERROR_REPARSE) {
|
||||
uint32_t depth = 0;
|
||||
/* one of the parent components was a symlink */
|
||||
do {
|
||||
if (++depth > NFS41_MAX_SYMLINK_DEPTH) {
|
||||
status = ERROR_TOO_MANY_LINKS;
|
||||
goto out_free_state;
|
||||
}
|
||||
|
||||
/* replace the path with the symlink target's */
|
||||
status = nfs41_symlink_target(state->session,
|
||||
&state->parent, &state->path);
|
||||
if (status) {
|
||||
/* can't do the reparse if we can't get the target */
|
||||
eprintf("nfs41_symlink_target() failed with %d\n", status);
|
||||
goto out_free_state;
|
||||
}
|
||||
|
||||
/* redo the lookup until it doesn't return REPARSE */
|
||||
status = nfs41_lookup(args->root, state->session,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue