diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 28 |
1 files changed, 3 insertions, 25 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index c478fc8db776..c420eba4876b 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -770,33 +770,12 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
| 770 | err = path_lookup(sunaddr->sun_path, LOOKUP_PARENT, &nd); | 770 | err = path_lookup(sunaddr->sun_path, LOOKUP_PARENT, &nd); |
| 771 | if (err) | 771 | if (err) |
| 772 | goto out_mknod_parent; | 772 | goto out_mknod_parent; |
| 773 | /* | 773 | |
| 774 | * Yucky last component or no last component at all? | 774 | dentry = lookup_create(&nd, 0); |
| 775 | * (foo/., foo/.., /////) | ||
| 776 | */ | ||
| 777 | err = -EEXIST; | ||
| 778 | if (nd.last_type != LAST_NORM) | ||
| 779 | goto out_mknod; | ||
| 780 | /* | ||
| 781 | * Lock the directory. | ||
| 782 | */ | ||
| 783 | down(&nd.dentry->d_inode->i_sem); | ||
| 784 | /* | ||
| 785 | * Do the final lookup. | ||
| 786 | */ | ||
| 787 | dentry = lookup_hash(&nd.last, nd.dentry); | ||
| 788 | err = PTR_ERR(dentry); | 775 | err = PTR_ERR(dentry); |
| 789 | if (IS_ERR(dentry)) | 776 | if (IS_ERR(dentry)) |
| 790 | goto out_mknod_unlock; | 777 | goto out_mknod_unlock; |
| 791 | err = -ENOENT; | 778 | |
| 792 | /* | ||
| 793 | * Special case - lookup gave negative, but... we had foo/bar/ | ||
| 794 | * From the vfs_mknod() POV we just have a negative dentry - | ||
| 795 | * all is fine. Let's be bastards - you had / on the end, you've | ||
| 796 | * been asking for (non-existent) directory. -ENOENT for you. | ||
| 797 | */ | ||
| 798 | if (nd.last.name[nd.last.len] && !dentry->d_inode) | ||
| 799 | goto out_mknod_dput; | ||
| 800 | /* | 779 | /* |
| 801 | * All right, let's create it. | 780 | * All right, let's create it. |
| 802 | */ | 781 | */ |
| @@ -845,7 +824,6 @@ out_mknod_dput: | |||
| 845 | dput(dentry); | 824 | dput(dentry); |
| 846 | out_mknod_unlock: | 825 | out_mknod_unlock: |
| 847 | up(&nd.dentry->d_inode->i_sem); | 826 | up(&nd.dentry->d_inode->i_sem); |
| 848 | out_mknod: | ||
| 849 | path_release(&nd); | 827 | path_release(&nd); |
| 850 | out_mknod_parent: | 828 | out_mknod_parent: |
| 851 | if (err==-EEXIST) | 829 | if (err==-EEXIST) |
