From: Bernd Moessner <berndmoessne...@gmail.com> Disallow writes that do not match alignment / req. length
This feature applies if the min write block size is != 0. Closes #4981 --- cpukit/dev/flash/flashdev.c | 11 +++++++++++ testsuites/libtests/flashdev01/init.c | 24 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/cpukit/dev/flash/flashdev.c b/cpukit/dev/flash/flashdev.c index 8aa4380ab7..9e319321be 100644 --- a/cpukit/dev/flash/flashdev.c +++ b/cpukit/dev/flash/flashdev.c @@ -323,6 +323,7 @@ static int rtems_flashdev_read_write( rtems_flashdev *flash = IMFS_generic_get_context_by_iop( iop ); off_t addr; int status; + size_t min_write_block_size = 0; if ( read_buff == NULL && write_buff == NULL ) { rtems_set_errno_and_return_minus_one( EINVAL ); @@ -339,6 +340,16 @@ static int rtems_flashdev_read_write( if ( read_buff != NULL ) { status = ( *flash->read )( flash, addr, count, read_buff ); } else if ( write_buff != NULL ) { + /* Make sure we have aligned writes in min. write block size is set */ + ( *flash->get_min_write_block_size )( flash, &min_write_block_size ); + if (min_write_block_size) + { + if((addr % min_write_block_size) || (count % min_write_block_size) ) + { + rtems_flashdev_release( flash ); + rtems_set_errno_and_return_minus_one( EINVAL ); + } + } status = ( *flash->write )( flash, addr, count, write_buff ); } rtems_flashdev_release( flash ); diff --git a/testsuites/libtests/flashdev01/init.c b/testsuites/libtests/flashdev01/init.c index 5755708525..bbbbebbbfe 100644 --- a/testsuites/libtests/flashdev01/init.c +++ b/testsuites/libtests/flashdev01/init.c @@ -215,11 +215,33 @@ static void run_test(void) { /* Open the flashdev */ file = fopen(flash_path, "r+"); + fd = fileno(file); + + /* Write the test name to the flash - actually to newlib s buffer */ + status = fwrite(test_string, 1, sizeof(test_string)-1, file); + /* False positive, rtems_flashdev_read_write was not called. String is still + * in buffer. + */ + rtems_test_assert(status == sizeof(test_string)-1); + /* Flush will call rtems_flashdev_read_write and we see that things fail */ + status = fflush(file); + rtems_test_assert(status); + /* Adjust the file buffering */ status = setvbuf(file, NULL, _IOFBF, min_write_write_block_size_in[1]); rtems_test_assert(!status); - fd = fileno(file); + fseek(file, 0x0, SEEK_SET); + + /* Write the test name to the flash - actually to newlib s buffer */ + status = fwrite(test_string, 1, sizeof(test_string)-1, file); + /* False positive, rtems_flashdev_read_write was not called. String is still + * in buffer. + */ + rtems_test_assert(status == sizeof(test_string)-1); + /* Flush will call rtems_flashdev_read_write and we see that things fail */ + status = fflush(file); + rtems_test_assert(status); /* Test Regions - this one must fail */ region.offset = 0x401; -- 2.34.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel