|
@@ -2624,6 +2624,10 @@ static long do_rmdir(int dfd, const char __user *pathname)
|
|
error = PTR_ERR(dentry);
|
|
error = PTR_ERR(dentry);
|
|
if (IS_ERR(dentry))
|
|
if (IS_ERR(dentry))
|
|
goto exit2;
|
|
goto exit2;
|
|
|
|
+ if (!dentry->d_inode) {
|
|
|
|
+ error = -ENOENT;
|
|
|
|
+ goto exit3;
|
|
|
|
+ }
|
|
error = mnt_want_write(nd.path.mnt);
|
|
error = mnt_want_write(nd.path.mnt);
|
|
if (error)
|
|
if (error)
|
|
goto exit3;
|
|
goto exit3;
|
|
@@ -2709,11 +2713,10 @@ static long do_unlinkat(int dfd, const char __user *pathname)
|
|
error = PTR_ERR(dentry);
|
|
error = PTR_ERR(dentry);
|
|
if (!IS_ERR(dentry)) {
|
|
if (!IS_ERR(dentry)) {
|
|
/* Why not before? Because we want correct error value */
|
|
/* Why not before? Because we want correct error value */
|
|
- if (nd.last.name[nd.last.len])
|
|
|
|
- goto slashes;
|
|
|
|
inode = dentry->d_inode;
|
|
inode = dentry->d_inode;
|
|
- if (inode)
|
|
|
|
- ihold(inode);
|
|
|
|
|
|
+ if (nd.last.name[nd.last.len] || !inode)
|
|
|
|
+ goto slashes;
|
|
|
|
+ ihold(inode);
|
|
error = mnt_want_write(nd.path.mnt);
|
|
error = mnt_want_write(nd.path.mnt);
|
|
if (error)
|
|
if (error)
|
|
goto exit2;
|
|
goto exit2;
|