diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-12-21 12:21:11 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-12-21 15:45:55 +0100 |
commit | 3b91605e84e95695cce43fefb73d4a58a57a62bb (patch) | |
tree | 1f5498307606b6d1f90dd297c883e6c6ef1691e4 /testsuites/fstests/fsimfsgeneric01/init.c | |
parent | libcsupport: Add rtems_resource_snapshot_take() (diff) | |
download | rtems-3b91605e84e95695cce43fefb73d4a58a57a62bb.tar.bz2 |
IMFS: Fix resource leak in IMFS_allocate_node()
Diffstat (limited to 'testsuites/fstests/fsimfsgeneric01/init.c')
-rw-r--r-- | testsuites/fstests/fsimfsgeneric01/init.c | 65 |
1 files changed, 58 insertions, 7 deletions
diff --git a/testsuites/fstests/fsimfsgeneric01/init.c b/testsuites/fstests/fsimfsgeneric01/init.c index 482821aacc..720a963fdf 100644 --- a/testsuites/fstests/fsimfsgeneric01/init.c +++ b/testsuites/fstests/fsimfsgeneric01/init.c @@ -26,6 +26,7 @@ #include <rtems/imfs.h> #include <rtems/malloc.h> +#include <rtems/libcsupport.h> typedef enum { TEST_NEW, @@ -313,12 +314,44 @@ static void test_imfs_make_generic_node(void) rtems_test_assert(state == TEST_DESTROYED); } +static IMFS_jnode_t *node_initialize_error( + IMFS_jnode_t *node, + const IMFS_types_union *info +) +{ + errno = EIO; + + return NULL; +} + +static IMFS_jnode_t *node_remove_inhibited(IMFS_jnode_t *node) +{ + rtems_test_assert(false); + + return node; +} + +static IMFS_jnode_t *node_destroy_inhibited(IMFS_jnode_t *node) +{ + rtems_test_assert(false); + + return node; +} + static const IMFS_node_control node_invalid_control = { .imfs_type = IMFS_DIRECTORY, .handlers = &node_handlers, - .node_initialize = node_initialize, - .node_remove = node_remove, - .node_destroy = node_destroy + .node_initialize = node_initialize_error, + .node_remove = node_remove_inhibited, + .node_destroy = node_destroy_inhibited +}; + +static const IMFS_node_control node_initialization_error_control = { + .imfs_type = IMFS_GENERIC, + .handlers = &node_handlers, + .node_initialize = node_initialize_error, + .node_remove = node_remove_inhibited, + .node_destroy = node_destroy_inhibited }; static void test_imfs_make_generic_node_errors(void) @@ -330,6 +363,9 @@ static void test_imfs_make_generic_node_errors(void) (rtems_filesystem_mount_table_entry_t *) rtems_chain_first(chain); const char *type = mt_entry->type; void *opaque = NULL; + rtems_resource_snapshot before; + + rtems_resource_snapshot_take(&before); errno = 0; rv = IMFS_make_generic_node( @@ -340,6 +376,7 @@ static void test_imfs_make_generic_node_errors(void) ); rtems_test_assert(rv == -1); rtems_test_assert(errno == EINVAL); + rtems_test_assert(rtems_resource_snapshot_check(&before)); errno = 0; rv = IMFS_make_generic_node( @@ -350,30 +387,44 @@ static void test_imfs_make_generic_node_errors(void) ); rtems_test_assert(rv == -1); rtems_test_assert(errno == EINVAL); + rtems_test_assert(rtems_resource_snapshot_check(&before)); - mt_entry->type = "XXX"; errno = 0; + mt_entry->type = "XXX"; rv = IMFS_make_generic_node( path, S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO, &node_control, NULL ); + mt_entry->type = type; rtems_test_assert(rv == -1); rtems_test_assert(errno == ENOTSUP); - mt_entry->type = type; + rtems_test_assert(rtems_resource_snapshot_check(&before)); - opaque = rtems_heap_greedy_allocate(NULL, 0); errno = 0; + opaque = rtems_heap_greedy_allocate(NULL, 0); rv = IMFS_make_generic_node( path, S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO, &node_control, NULL ); + rtems_heap_greedy_free(opaque); rtems_test_assert(rv == -1); rtems_test_assert(errno == ENOMEM); - rtems_heap_greedy_free(opaque); + rtems_test_assert(rtems_resource_snapshot_check(&before)); + + errno = 0; + rv = IMFS_make_generic_node( + path, + S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO, + &node_initialization_error_control, + NULL + ); + rtems_test_assert(rv == -1); + rtems_test_assert(errno == EIO); + rtems_test_assert(rtems_resource_snapshot_check(&before)); } static void Init(rtems_task_argument arg) |