2.5.50: unused code in link_path_walk()
@@ -700,7 +700,6 @@
if (this.name[1] != '.')
break;
follow_dotdot(&nd->mnt, &nd->dentry);
- inode = nd->dentry->d_inode;
/* fallthrough */
case 1:
goto return_base;seems broken to me. if follow_dotdot() changes nd->dentry (can happen!), inode needs to be changed. look:
inode = nd->dentry->d_inode;
for(;;) {
err = exec_permission_lite(inode);
if (this.name[0] == '.') switch (this.len) {
case 2:
if (this.name[1] != '.')
break;
follow_dotdot(&nd->mnt, &nd->dentry);
inode = nd->dentry->d_inode;
/* fallthrough */
case 1:
continue;
}
}btw, you should cc linux-fsdevel for patches to the VFS.
Signature · 3 lines
"It's not Hollywood. War is real, war is primarily not about defeat or victory, it is about death. I've seen thousands and thousands of dead bodies. Do you think I want to have an academic debate on this subject?" -- Robert Fisk
Quoted 12 lines · Matthew Wilcox
(quoted diff) +0
-1@@ -700,7 +700,6 @@ if (this.name[1] != '.') break; follow_dotdot(&nd->mnt, &nd->dentry); - inode = nd->dentry->d_inode; /* fallthrough */ case 1: goto return_base;seems broken to me. if
follow_dotdot()changesnd->dentry(can happen!), inode needs to be changed. look:
Quoted 14 lines
inode = nd->dentry->d_inode;
for(;;) {
err = exec_permission_lite(inode);
if (this.name[0] == '.') switch (this.len) {
case 2:
if (this.name[1] != '.')
break;
follow_dotdot(&nd->mnt, &nd->dentry);
inode = nd->dentry->d_inode;
/* fallthrough */
case 1:
continue;
}
}You looked at the _first_ switch statement. You must go further down to the _second_ switch. *There*, you don't need this assignment, AFAICS.
Quoted 1 line
btw, you should cc linux-fsdevel for patches to the VFS.
Thanks for this pointer, I'll spam linux-fsdevel in the future ;-).
Regards, Olaf.