if(inodeId >= 0 && inodeId < YAFFSFS_N_HANDLES){
yaffsfs_Inode *in = & yaffsfs_inode[inodeId];
in->count--;
- if(in->count <= 0)
+ if(in->count <= 0){
yaffsfs_ReleaseInode(in);
+ in->count = 0;
+ }
}
}
return 0;
}
-static void yaffsfs_PutDeviceHandles(struct yaffs_dev *dev)
+static void yaffsfs_BreakDeviceHandles(struct yaffs_dev *dev)
{
- yaffsfs_Handle *yh;
+ yaffsfs_Handle *h;
+ struct yaffs_obj *obj;
int i;
for(i = 0; i < YAFFSFS_N_HANDLES; i++){
- yh = & yaffsfs_handle[i];
- if(yh->useCount>0 &&
- yaffsfs_inode[yh->inodeId].iObj->my_dev == dev)
- yaffsfs_PutHandle(i);
+ h = yaffsfs_GetHandlePointer(i);
+ obj = yaffsfs_GetHandleObject(i);
+ if(h && h->useCount>0 && obj && obj->my_dev == dev){
+ h->useCount = 0;
+ yaffsfs_PutInode(h->inodeId);
+ h->inodeId = -1;
+ }
}
}
struct yaffs_obj *obj = NULL;
int pos = 0;
int startPos = 0;
+ int endPos = 0;
int nRead = 0;
int nToRead = 0;
int totalRead = 0;
yaffsfs_GetHandle(fd);
+ endPos = pos + nbyte;
+
+ if(pos < 0 || pos > YAFFS_MAX_FILE_SIZE ||
+ nbyte > YAFFS_MAX_FILE_SIZE ||
+ endPos < 0 || endPos > YAFFS_MAX_FILE_SIZE){
+ totalRead = -1;
+ nbyte = 0;
+ }
+
while(nbyte > 0) {
nToRead = YAFFSFS_RW_SIZE - (pos & (YAFFSFS_RW_SIZE -1));
if(nToRead > nbyte)
if(!isPread) {
if(totalRead >= 0)
h->position = startPos + totalRead;
- else {
- /* todo error */
- }
+ else
+ yaffsfs_SetError(-EINVAL);
}
}
struct yaffs_obj *obj = NULL;
int pos = 0;
int startPos = 0;
+ int endPos;
int nWritten = 0;
int totalWritten = 0;
int write_trhrough = 0;
yaffsfs_GetHandle(fd);
pos = startPos;
+ endPos = pos + nbyte;
+
+ if(pos < 0 || pos > YAFFS_MAX_FILE_SIZE ||
+ nbyte > YAFFS_MAX_FILE_SIZE ||
+ endPos < 0 || endPos > YAFFS_MAX_FILE_SIZE){
+ totalWritten = -1;
+ nbyte = 0;
+ }
+
while(nbyte > 0) {
nToWrite = YAFFSFS_RW_SIZE - (pos & (YAFFSFS_RW_SIZE -1));
if(!isPwrite){
if(totalWritten > 0)
h->position = startPos + totalWritten;
- else {
- /* todo error */
- }
+ else
+ yaffsfs_SetError(-EINVAL);
}
}
pos = fSize + offset;
}
- if(pos >= 0)
+ if(pos >= 0 && pos <= YAFFS_MAX_FILE_SIZE)
h->position = pos;
- else
+ else{
yaffsfs_SetError(-EINVAL);
+ pos = -1;
+ }
}
yaffsfs_Unlock();
if(!inUse || force){
if(inUse)
- yaffsfs_PutDeviceHandles(dev);
+ yaffsfs_BreakDeviceHandles(dev);
yaffs_deinitialise(dev);
retVal = 0;