projects
/
yaffs2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
yaffs: Fix yaffs_readdir when dereferencing a symlink
[yaffs2.git]
/
direct
/
yaffsfs.c
diff --git
a/direct/yaffsfs.c
b/direct/yaffsfs.c
index 9db29b99aec583c7be6b22def918107bcb4d934b..cdde7abe4a549df817287d64390c87c083a78fc9 100644
(file)
--- a/
direct/yaffsfs.c
+++ b/
direct/yaffsfs.c
@@
-398,7
+398,7
@@
static void yaffsfs_BreakDeviceHandles(struct yaffs_dev *dev)
* Stuff to handle names.
*/
#ifdef CONFIG_YAFFS_CASE_INSENSITIVE
* Stuff to handle names.
*/
#ifdef CONFIG_YAFFS_CASE_INSENSITIVE
-
+#ifndef CONFIG_YAFFS_WINCE
static int yaffs_toupper(YCHAR a)
{
if (a >= 'a' && a <= 'z')
static int yaffs_toupper(YCHAR a)
{
if (a >= 'a' && a <= 'z')
@@
-406,6
+406,7
@@
static int yaffs_toupper(YCHAR a)
else
return a;
}
else
return a;
}
+#endif
static int yaffsfs_Match(YCHAR a, YCHAR b)
{
static int yaffsfs_Match(YCHAR a, YCHAR b)
{
@@
-432,7
+433,7
@@
static int yaffsfs_IsPathDivider(YCHAR ch)
return 0;
}
return 0;
}
-static int yaffsfs_CheckNameLength(const
char
*name)
+static int yaffsfs_CheckNameLength(const
YCHAR
*name)
{
int retVal = 0;
{
int retVal = 0;
@@
-514,17
+515,17
@@
static struct yaffs_dev *yaffsfs_FindDevice(const YCHAR *path,
thisMatchLength = 0;
matching = 1;
thisMatchLength = 0;
matching = 1;
+
if(!p)
continue;
if(!p)
continue;
- while (matching && *p && *leftOver) {
- /* Skip over any /s */
- while (yaffsfs_IsPathDivider(*p))
- p++;
+ /* Skip over any leading /s */
+ while (yaffsfs_IsPathDivider(*p))
+ p++;
+ while (yaffsfs_IsPathDivider(*leftOver))
+ leftOver++;
- /* Skip over any /s */
- while (yaffsfs_IsPathDivider(*leftOver))
- leftOver++;
+ while (matching && *p && *leftOver) {
/* Now match the text part */
while (matching &&
/* Now match the text part */
while (matching &&
@@
-538,6
+539,16
@@
static struct yaffs_dev *yaffsfs_FindDevice(const YCHAR *path,
matching = 0;
}
}
matching = 0;
}
}
+
+ if ((*p && !yaffsfs_IsPathDivider(*p)) ||
+ (*leftOver && !yaffsfs_IsPathDivider(*leftOver)))
+ matching = 0;
+ else {
+ while (yaffsfs_IsPathDivider(*p))
+ p++;
+ while (yaffsfs_IsPathDivider(*leftOver))
+ leftOver++;
+ }
}
/* Skip over any /s in leftOver */
}
/* Skip over any /s in leftOver */
@@
-558,7
+569,6
@@
static struct yaffs_dev *yaffsfs_FindDevice(const YCHAR *path,
retval = dev;
longestMatch = thisMatchLength;
}
retval = dev;
longestMatch = thisMatchLength;
}
-
}
return retval;
}
}
return retval;
}
@@
-1077,7
+1087,7
@@
static int yaffs_Dofsync(int handle, int datasync)
else if (obj->my_dev->read_only)
yaffsfs_SetError(-EROFS);
else {
else if (obj->my_dev->read_only)
yaffsfs_SetError(-EROFS);
else {
- yaffs_flush_file(obj, 1, datasync);
+ yaffs_flush_file(obj, 1, datasync
, 0
);
retVal = 0;
}
retVal = 0;
}
@@
-1119,7
+1129,7
@@
int yaffs_close(int handle)
else {
/* clean up */
if(!f->isDir)
else {
/* clean up */
if(!f->isDir)
- yaffs_flush_file(obj, 1, 0);
+ yaffs_flush_file(obj, 1, 0
, 1
);
yaffsfs_PutHandle(handle);
retVal = 0;
}
yaffsfs_PutHandle(handle);
retVal = 0;
}
@@
-1854,8
+1864,6
@@
static int yaffsfs_DoUtime(struct yaffs_obj *obj,
const struct yaffs_utimbuf *buf)
{
int retVal = -1;
const struct yaffs_utimbuf *buf)
{
int retVal = -1;
- int result;
-
struct yaffs_utimbuf local;
obj = yaffs_get_equivalent_obj(obj);
struct yaffs_utimbuf local;
obj = yaffs_get_equivalent_obj(obj);
@@
-1865,6
+1873,7
@@
static int yaffsfs_DoUtime(struct yaffs_obj *obj,
return -1;
}
return -1;
}
+#if !CONFIG_YAFFS_WINCE
if (!buf) {
local.actime = Y_CURRENT_TIME;
local.modtime = local.actime;
if (!buf) {
local.actime = Y_CURRENT_TIME;
local.modtime = local.actime;
@@
-1872,12
+1881,15
@@
static int yaffsfs_DoUtime(struct yaffs_obj *obj,
}
if (obj) {
}
if (obj) {
+ int result;
+
obj->yst_atime = buf->actime;
obj->yst_mtime = buf->modtime;
obj->dirty = 1;
obj->yst_atime = buf->actime;
obj->yst_mtime = buf->modtime;
obj->dirty = 1;
- result = yaffs_flush_file(obj, 0, 0);
+ result = yaffs_flush_file(obj, 0, 0
, 0
);
retVal = result == YAFFS_OK ? 0 : -1;
}
retVal = result == YAFFS_OK ? 0 : -1;
}
+#endif
return retVal;
}
return retVal;
}
@@
-2460,7
+2472,7
@@
int yaffs_set_wince_times(int fd,
}
obj->dirty = 1;
}
obj->dirty = 1;
- result = yaffs_flush_file(obj, 0, 0);
+ result = yaffs_flush_file(obj, 0, 0
, 0
);
retVal = 0;
} else
/* bad handle */
retVal = 0;
} else
/* bad handle */
@@
-2483,7
+2495,7
@@
static int yaffsfs_DoChMod(struct yaffs_obj *obj, mode_t mode)
if (obj) {
obj->yst_mode = mode;
obj->dirty = 1;
if (obj) {
obj->yst_mode = mode;
obj->dirty = 1;
- result = yaffs_flush_file(obj, 0, 0);
+ result = yaffs_flush_file(obj, 0, 0
, 0
);
}
return result == YAFFS_OK ? 0 : -1;
}
return result == YAFFS_OK ? 0 : -1;
@@
-2866,7
+2878,7
@@
int yaffs_sync_common(struct yaffs_dev *dev, const YCHAR *path)
yaffsfs_SetError(-EROFS);
else {
yaffsfs_SetError(-EROFS);
else {
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev
, 0
);
yaffs_checkpoint_save(dev);
retVal = 0;
yaffs_checkpoint_save(dev);
retVal = 0;
@@
-2973,7
+2985,7
@@
int yaffs_remount_common(struct yaffs_dev *dev, const YCHAR *path,
if (dev) {
if (dev->is_mounted) {
if (dev) {
if (dev->is_mounted) {
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev
, 0
);
if (force || !yaffsfs_IsDevBusy(dev)) {
if (read_only)
if (force || !yaffsfs_IsDevBusy(dev)) {
if (read_only)
@@
-3024,7
+3036,7
@@
int yaffs_unmount2_common(struct yaffs_dev *dev, const YCHAR *path, int force)
if (dev) {
if (dev->is_mounted) {
int inUse;
if (dev) {
if (dev->is_mounted) {
int inUse;
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev
, 0
);
yaffs_checkpoint_save(dev);
inUse = yaffsfs_IsDevBusy(dev);
if (!inUse || force) {
yaffs_checkpoint_save(dev);
inUse = yaffsfs_IsDevBusy(dev);
if (!inUse || force) {
@@
-3097,7
+3109,7
@@
int yaffs_format_common(struct yaffs_dev *dev,
if (dev->is_mounted && unmount_flag) {
int inUse;
if (dev->is_mounted && unmount_flag) {
int inUse;
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev
, 0
);
yaffs_checkpoint_save(dev);
inUse = yaffsfs_IsDevBusy(dev);
if (!inUse || force_unmount_flag) {
yaffs_checkpoint_save(dev);
inUse = yaffsfs_IsDevBusy(dev);
if (!inUse || force_unmount_flag) {
@@
-3416,6
+3428,7
@@
static yaffs_DIR *yaffsfs_opendir_reldir_no_lock(struct yaffs_obj *reldir,
}
obj = yaffsfs_FindObject(reldir, dirname, 0, 1, NULL, ¬Dir, &loop);
}
obj = yaffsfs_FindObject(reldir, dirname, 0, 1, NULL, ¬Dir, &loop);
+ obj = yaffsfs_FollowLink(obj, 0, &loop);
if (!obj && notDir)
yaffsfs_SetError(-ENOTDIR);
if (!obj && notDir)
yaffsfs_SetError(-ENOTDIR);
@@
-3461,6
+3474,12
@@
yaffs_DIR *yaffs_opendir_reldir(struct yaffs_obj *reldir, const YCHAR *dirname)
yaffsfs_Unlock();
return ret;
}
yaffsfs_Unlock();
return ret;
}
+
+yaffs_DIR *yaffs_opendir_reldev(struct yaffs_dev *dev, const YCHAR *dirname)
+{
+ return yaffs_opendir_reldir(ROOT_DIR(dev), dirname);
+}
+
yaffs_DIR *yaffs_opendir(const YCHAR *dirname)
{
return yaffs_opendir_reldir(NULL, dirname);
yaffs_DIR *yaffs_opendir(const YCHAR *dirname)
{
return yaffs_opendir_reldir(NULL, dirname);