* directory structure. This is to prevent removing a subtree alltogether
*/
if ((oldvptr != newvptr) && (fileptr->disk.type == vDirectory)) {
- for (testnode = newvptr->disk.parent; testnode != 0;) {
+ afs_int32 forpass = 0, vnum = 0, top = 0;
+ for (testnode = newvptr->disk.parent; testnode != 0; forpass++) {
+ if (testnode > vnum) vnum = testnode;
+ if (forpass > vnum) {
+ errorCode = FSERR_ELOOP;
+ goto Bad_Rename;
+ }
if (testnode == oldvptr->vnodeNumber) {
testnode = oldvptr->disk.parent;
continue;
errorCode = FSERR_ELOOP;
goto Bad_Rename;
}
+ if (testnode == 1) top = 1;
testvptr = VGetVnode(&errorCode, volptr, testnode, READ_LOCK);
assert(errorCode == 0);
testnode = testvptr->disk.parent;
VPutVnode(&errorCode, testvptr);
+ if ((top == 1) && (testnode != 0)) {
+ VTakeOffline(volptr);
+ errorCode = EIO;
+ goto Bad_Rename;
+ }
assert(errorCode == 0);
}
}