diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-20 04:03:41 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-29 13:24:16 -0400 |
| commit | bc65a1215eda3e067801e0a8f3eeffb62800f355 (patch) | |
| tree | f53aefd935c6e99ffe24dee94a322083536d3004 /fs/ecryptfs | |
| parent | faf02010290e202e275c1bf94ca9dd808bf85607 (diff) | |
sanitize ecryptfs_lookup()
* ->lookup() never gets hit with . or ..
* dentry it gets is unhashed, so unless we had gone and hashed it ourselves, there's
no need to d_drop() the sucker.
* wrong name printed in one of the printks (NULL, in fact)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ecryptfs')
| -rw-r--r-- | fs/ecryptfs/inode.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index ffa2be57804..eeb734aea5b 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -381,12 +381,6 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | |||
| 381 | struct dentry *lower_dir_dentry, *lower_dentry; | 381 | struct dentry *lower_dir_dentry, *lower_dentry; |
| 382 | int rc = 0; | 382 | int rc = 0; |
| 383 | 383 | ||
| 384 | if ((ecryptfs_dentry->d_name.len == 1 | ||
| 385 | && !strcmp(ecryptfs_dentry->d_name.name, ".")) | ||
| 386 | || (ecryptfs_dentry->d_name.len == 2 | ||
| 387 | && !strcmp(ecryptfs_dentry->d_name.name, ".."))) { | ||
| 388 | goto out_d_drop; | ||
| 389 | } | ||
| 390 | lower_dir_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry->d_parent); | 384 | lower_dir_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry->d_parent); |
| 391 | mutex_lock(&lower_dir_dentry->d_inode->i_mutex); | 385 | mutex_lock(&lower_dir_dentry->d_inode->i_mutex); |
| 392 | lower_dentry = lookup_one_len(ecryptfs_dentry->d_name.name, | 386 | lower_dentry = lookup_one_len(ecryptfs_dentry->d_name.name, |
| @@ -397,8 +391,8 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | |||
| 397 | rc = PTR_ERR(lower_dentry); | 391 | rc = PTR_ERR(lower_dentry); |
| 398 | ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " | 392 | ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " |
| 399 | "[%d] on lower_dentry = [%s]\n", __func__, rc, | 393 | "[%d] on lower_dentry = [%s]\n", __func__, rc, |
| 400 | encrypted_and_encoded_name); | 394 | ecryptfs_dentry->d_name.name); |
| 401 | goto out_d_drop; | 395 | goto out; |
| 402 | } | 396 | } |
| 403 | if (lower_dentry->d_inode) | 397 | if (lower_dentry->d_inode) |
| 404 | goto interpose; | 398 | goto interpose; |
| @@ -415,7 +409,7 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | |||
| 415 | if (rc) { | 409 | if (rc) { |
| 416 | printk(KERN_ERR "%s: Error attempting to encrypt and encode " | 410 | printk(KERN_ERR "%s: Error attempting to encrypt and encode " |
| 417 | "filename; rc = [%d]\n", __func__, rc); | 411 | "filename; rc = [%d]\n", __func__, rc); |
| 418 | goto out_d_drop; | 412 | goto out; |
| 419 | } | 413 | } |
| 420 | mutex_lock(&lower_dir_dentry->d_inode->i_mutex); | 414 | mutex_lock(&lower_dir_dentry->d_inode->i_mutex); |
| 421 | lower_dentry = lookup_one_len(encrypted_and_encoded_name, | 415 | lower_dentry = lookup_one_len(encrypted_and_encoded_name, |
| @@ -427,14 +421,11 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | |||
| 427 | ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " | 421 | ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " |
| 428 | "[%d] on lower_dentry = [%s]\n", __func__, rc, | 422 | "[%d] on lower_dentry = [%s]\n", __func__, rc, |
| 429 | encrypted_and_encoded_name); | 423 | encrypted_and_encoded_name); |
| 430 | goto out_d_drop; | 424 | goto out; |
| 431 | } | 425 | } |
| 432 | interpose: | 426 | interpose: |
| 433 | rc = ecryptfs_lookup_interpose(ecryptfs_dentry, lower_dentry, | 427 | rc = ecryptfs_lookup_interpose(ecryptfs_dentry, lower_dentry, |
| 434 | ecryptfs_dir_inode); | 428 | ecryptfs_dir_inode); |
| 435 | goto out; | ||
| 436 | out_d_drop: | ||
| 437 | d_drop(ecryptfs_dentry); | ||
| 438 | out: | 429 | out: |
| 439 | kfree(encrypted_and_encoded_name); | 430 | kfree(encrypted_and_encoded_name); |
| 440 | return ERR_PTR(rc); | 431 | return ERR_PTR(rc); |
