X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs%2F.git;a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=207c06930f24226bbb99e925b72919849ea1e58d;hp=f4dfdcb6055a305890b4a201a78dbbcb2668fb57;hb=d48b3f2cc376fdf9201ae430baba8532c01b05b1;hpb=f5b76bfb34c6b0b5e42a4247dc2df3014a70a425 diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index f4dfdcb..207c069 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -25,7 +25,7 @@ #endif -const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.5 2003-03-11 05:16:53 charles Exp $"; +const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.6 2003-03-11 09:54:40 charles Exp $"; // configurationList is the list of devices that are supported static yaffsfs_DeviceConfiguration *yaffsfs_configurationList; @@ -739,27 +739,51 @@ int yaffs_rename(const char *oldPath, const char *newPath) { yaffs_Object *olddir = NULL; yaffs_Object *newdir = NULL; + yaffs_Object *obj = NULL; char *oldname; char *newname; int result= YAFFS_FAIL; + int renameAllowed = 1; yaffsfs_Lock(); olddir = yaffsfs_FindDirectory(NULL,oldPath,&oldname,0); newdir = yaffsfs_FindDirectory(NULL,newPath,&newname,0); + obj = yaffsfs_FindObject(NULL,oldPath,0); - if(!olddir || !newdir) + if(!olddir || !newdir || !obj) { - // bad handle - yaffsfs_SetError(-EBADF); + // bad file + yaffsfs_SetError(-EBADF); + renameAllowed = 0; } else if(olddir->myDev != newdir->myDev) { // oops must be on same device // todo error yaffsfs_SetError(-EXDEV); + renameAllowed = 0; } - else + else if(obj && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY) + { + // It is a directory, check that it is not being renamed to + // being its own decendent. + // Do this by tracing from the new directory back to the root, checking for obj + + yaffs_Object *xx = newdir; + + while( renameAllowed && xx) + { + if(xx == obj) + { + renameAllowed = 0; + } + xx = xx->parent; + } + if(!renameAllowed) yaffsfs_SetError(-EACCESS); + } + + if(renameAllowed) { result = yaffs_RenameObject(olddir,oldname,newdir,newname); }