Add missing boundary check when seeking in a file.

This commit is contained in:
Godzil 2022-05-27 12:02:15 +01:00 committed by Manoel Trapier
parent bd96f10492
commit 334ea87d25
3 changed files with 82 additions and 15 deletions

View File

@ -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;

View File

@ -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)
{ {

View 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], '!');
} }