yaffs direct: Fix renaming file over directory or directory over file
[yaffs2.git] / direct / yaffsfs.c
index a26998439ccefd2f0d4fe6b2119c15e65dee3cf1..27bc572b41fd2d62733968c46ae9c2bd86abe64c 100644 (file)
@@ -1482,6 +1482,24 @@ int yaffs_unlink(const YCHAR *path)
        return yaffsfs_DoUnlink(path, 0);
 }
 
+static int rename_file_over_dir(struct yaffs_obj *obj, struct yaffs_obj *newobj)
+{
+       if (obj && obj->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY &&
+           newobj && newobj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY)
+               return 1;
+       else
+               return 0;
+}
+
+static int rename_dir_over_file(struct yaffs_obj *obj, struct yaffs_obj *newobj)
+{
+       if (obj && obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY &&
+           newobj && newobj->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY)
+               return 1;
+       else
+               return 0;
+}
+
 int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath)
 {
        struct yaffs_obj *olddir = NULL;
@@ -1551,6 +1569,12 @@ int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath)
        } else if (obj->my_dev->read_only) {
                yaffsfs_SetError(-EROFS);
                rename_allowed = 0;
+       } else if (rename_file_over_dir(obj, newobj)) {
+               yaffsfs_SetError(-EISDIR);
+               rename_allowed = 0;
+       } else if (rename_dir_over_file(obj, newobj)) {
+               yaffsfs_SetError(-ENOTDIR);
+               rename_allowed = 0;
        } else if (yaffs_is_non_empty_dir(newobj)) {
                yaffsfs_SetError(-ENOTEMPTY);
                rename_allowed = 0;