diff options
author | Ian Kent <raven@themaw.net> | 2011-01-14 13:46:30 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-01-15 20:07:43 -0500 |
commit | 9e3fea16ba386fa549a0b2de8a203e5d412997a0 (patch) | |
tree | 88ee7f612240f8e33cc57d07a011a07db6280804 /fs/autofs4 | |
parent | 6651149371b842715906311b4631b8489cebf7e8 (diff) |
autofs4: Fix wait validation
It is possible for the check in wait.c:validate_request() to return
an incorrect result if the dentry that was mounted upon has changed
during the callback.
Signed-off-by: Ian Kent <raven@themaw.net>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/autofs4')
-rw-r--r-- | fs/autofs4/waitq.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index c5f8459c905e..56010056b2e6 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
@@ -309,6 +309,9 @@ static int validate_request(struct autofs_wait_queue **wait, | |||
309 | * completed while we waited on the mutex ... | 309 | * completed while we waited on the mutex ... |
310 | */ | 310 | */ |
311 | if (notify == NFY_MOUNT) { | 311 | if (notify == NFY_MOUNT) { |
312 | struct dentry *new = NULL; | ||
313 | int valid = 1; | ||
314 | |||
312 | /* | 315 | /* |
313 | * If the dentry was successfully mounted while we slept | 316 | * If the dentry was successfully mounted while we slept |
314 | * on the wait queue mutex we can return success. If it | 317 | * on the wait queue mutex we can return success. If it |
@@ -316,8 +319,20 @@ static int validate_request(struct autofs_wait_queue **wait, | |||
316 | * a multi-mount with no mount at it's base) we can | 319 | * a multi-mount with no mount at it's base) we can |
317 | * continue on and create a new request. | 320 | * continue on and create a new request. |
318 | */ | 321 | */ |
322 | if (!IS_ROOT(dentry)) { | ||
323 | if (dentry->d_inode && d_unhashed(dentry)) { | ||
324 | struct dentry *parent = dentry->d_parent; | ||
325 | new = d_lookup(parent, &dentry->d_name); | ||
326 | if (new) | ||
327 | dentry = new; | ||
328 | } | ||
329 | } | ||
319 | if (have_submounts(dentry)) | 330 | if (have_submounts(dentry)) |
320 | return 0; | 331 | valid = 0; |
332 | |||
333 | if (new) | ||
334 | dput(new); | ||
335 | return valid; | ||
321 | } | 336 | } |
322 | 337 | ||
323 | return 1; | 338 | return 1; |