Add missing boundary check when seeking in a file.
This commit is contained in:
parent
bd96f10492
commit
334ea87d25
@ -101,6 +101,7 @@ typedef enum miniffs_error_t
|
|||||||
MINIFFS_INVALID_PARAMS,
|
MINIFFS_INVALID_PARAMS,
|
||||||
MINIFFS_FILE_NOT_FOUND,
|
MINIFFS_FILE_NOT_FOUND,
|
||||||
MINIFFS_ALLOCATION_ERROR,
|
MINIFFS_ALLOCATION_ERROR,
|
||||||
|
MINIFFS_SEEK_OUT_OF_BOUNDARIES,
|
||||||
MINIFFS_END_OF_FILE,
|
MINIFFS_END_OF_FILE,
|
||||||
//MINIFFS_,
|
//MINIFFS_,
|
||||||
} miniffs_error_t;
|
} miniffs_error_t;
|
||||||
|
|||||||
26
miniffs.c
26
miniffs.c
@ -116,8 +116,8 @@ int miniffs_read_blocks(void *ptr, size_t size, size_t nmemb, file_t *file)
|
|||||||
|
|
||||||
int miniffs_seek(file_t *file, size_t offset, int whence)
|
int miniffs_seek(file_t *file, size_t offset, int whence)
|
||||||
{
|
{
|
||||||
switch(whence)
|
bool noError = true;
|
||||||
{
|
switch(whence) {
|
||||||
default:
|
default:
|
||||||
miniffs_seterror(MINIFFS_INVALID_PARAMS);
|
miniffs_seterror(MINIFFS_INVALID_PARAMS);
|
||||||
return -1;
|
return -1;
|
||||||
@ -129,11 +129,33 @@ int miniffs_seek(file_t *file, size_t offset, int whence)
|
|||||||
file->offset += offset;
|
file->offset += offset;
|
||||||
break;
|
break;
|
||||||
case MFFS_SEEK_END:
|
case MFFS_SEEK_END:
|
||||||
|
if (file->fent->size <= offset)
|
||||||
|
{
|
||||||
|
/* Negative boundary check */
|
||||||
|
noError = false;
|
||||||
|
miniffs_seterror(MINIFFS_SEEK_OUT_OF_BOUNDARIES);
|
||||||
|
file->offset = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
file->offset = file->fent->size - 1 - offset;
|
file->offset = file->fent->size - 1 - offset;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file->offset >= file->fent->size)
|
||||||
|
{
|
||||||
|
/* Positive Boundary check */
|
||||||
|
noError = false;
|
||||||
|
miniffs_seterror(MINIFFS_SEEK_OUT_OF_BOUNDARIES);
|
||||||
|
file->offset = file->fent->size - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noError)
|
||||||
|
{
|
||||||
miniffs_seterror(MINIFFS_NOERROR);
|
miniffs_seterror(MINIFFS_NOERROR);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t miniffs_tell(file_t *file)
|
size_t miniffs_tell(file_t *file)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -97,6 +97,51 @@ TEST(FileOperations, TestingSeek)
|
|||||||
ASSERT_EQ(miniffs_read(fp), '!');
|
ASSERT_EQ(miniffs_read(fp), '!');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(FileOperations, LargeOutOfBoundarySeeks)
|
||||||
|
{
|
||||||
|
miniffs_t *fs = get_fs("simple_test.mffs");
|
||||||
|
file_t *fp = miniffs_open(fs, "HELLO.TXT");
|
||||||
|
|
||||||
|
miniffs_seek(fp, 100, MFFS_SEEK_SET);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_SEEK_OUT_OF_BOUNDARIES);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), '!');
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_END_OF_FILE);
|
||||||
|
|
||||||
|
miniffs_seek(fp, 100, MFFS_SEEK_END);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_SEEK_OUT_OF_BOUNDARIES);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), 'H');
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(FileOperations, SeekingAroundBoundaries)
|
||||||
|
{
|
||||||
|
miniffs_t *fs = get_fs("simple_test.mffs");
|
||||||
|
file_t *fp = miniffs_open(fs, "HELLO.TXT");
|
||||||
|
|
||||||
|
miniffs_seek(fp, 10, MFFS_SEEK_SET);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_NOERROR);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), 'd');
|
||||||
|
|
||||||
|
miniffs_seek(fp, 11, MFFS_SEEK_SET);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_NOERROR);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), '!');
|
||||||
|
|
||||||
|
miniffs_seek(fp, 12, MFFS_SEEK_SET);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_SEEK_OUT_OF_BOUNDARIES);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), '!');
|
||||||
|
|
||||||
|
miniffs_seek(fp, 10, MFFS_SEEK_END);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_NOERROR);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), 'e');
|
||||||
|
|
||||||
|
miniffs_seek(fp, 11, MFFS_SEEK_END);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_NOERROR);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), 'H');
|
||||||
|
|
||||||
|
miniffs_seek(fp, 12, MFFS_SEEK_END);
|
||||||
|
ASSERT_EQ(miniffs_geterror(), MINIFFS_SEEK_OUT_OF_BOUNDARIES);
|
||||||
|
ASSERT_EQ(miniffs_read(fp), 'H');
|
||||||
|
}
|
||||||
|
|
||||||
TEST(FileOperations, TestingEndOfFileBoundary)
|
TEST(FileOperations, TestingEndOfFileBoundary)
|
||||||
{
|
{
|
||||||
miniffs_t *fs = get_fs("simple_test.mffs");
|
miniffs_t *fs = get_fs("simple_test.mffs");
|
||||||
@ -197,5 +242,4 @@ TEST(FileOperations, ReadTooManyBlocks)
|
|||||||
ASSERT_EQ(buffer[9], 'l');
|
ASSERT_EQ(buffer[9], 'l');
|
||||||
ASSERT_EQ(buffer[10], 'd');
|
ASSERT_EQ(buffer[10], 'd');
|
||||||
ASSERT_EQ(buffer[11], '!');
|
ASSERT_EQ(buffer[11], '!');
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user