From d48b3f2cc376fdf9201ae430baba8532c01b05b1 Mon Sep 17 00:00:00 2001 From: charles Date: Tue, 11 Mar 2003 09:54:38 +0000 Subject: [PATCH] *** empty log message *** --- direct/dtest.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++-- direct/yaffsfs.c | 34 ++++++++++++++++++++++++++++----- 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/direct/dtest.c b/direct/dtest.c index 965d808..de1eaa2 100644 --- a/direct/dtest.c +++ b/direct/dtest.c @@ -35,7 +35,6 @@ void copy_in_a_file(char *yaffsName,char *inName) - void fill_disk(char *path,int nfiles) { int h; @@ -268,7 +267,7 @@ static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expe } -int main(int argc, char *argv[]) +int long_test(int argc, char *argv[]) { int f; @@ -517,3 +516,49 @@ int main(int argc, char *argv[]) return 0; } + + + +int directory_rename_test(void) +{ + int r; + yaffs_StartUp(); + + yaffs_mount("/ram"); + yaffs_mkdir("/ram/a",0); + yaffs_mkdir("/ram/a/b",0); + yaffs_mkdir("/ram/c",0); + + printf("\nDirectory look-up of /ram\n"); + dumpDir("/ram"); + dumpDir("/ram/a"); + dumpDir("/ram/a/b"); + + printf("Do rename (should fail)\n"); + + r = yaffs_rename("/ram/a","/ram/a/b/d"); + printf("\nDirectory look-up of /ram\n"); + dumpDir("/ram"); + dumpDir("/ram/a"); + dumpDir("/ram/a/b"); + + printf("Do rename (should not fail)\n"); + + r = yaffs_rename("/ram/c","/ram/a/b/d"); + printf("\nDirectory look-up of /ram\n"); + dumpDir("/ram"); + dumpDir("/ram/a"); + dumpDir("/ram/a/b"); + + + return 1; + +} + +int main(int argc, char *argv[]) +{ + //return long_test(argc,argv); + + return directory_rename_test(); + +} 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); } -- 2.30.2