source: rtems/cpukit/libfs/src/imfs/imfs_initsupp.c @ 3c96bee

4.115
Last change on this file since 3c96bee was a6d35256, checked in by Gedare Bloom <gedare@…>, on 09/05/13 at 15:53:39

IMFS: Resource leak

Free fs_info in case root_node is NULL.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/**
2 * @file
3 *
4 * @brief IMFS Node Support
5 * @ingroup IMFS
6 */
7
8/*
9 *  COPYRIGHT (c) 1989-2010.
10 *  On-Line Applications Research Corporation (OAR).
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.com/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18  #include "config.h"
19#endif
20
21#include "imfs.h"
22
23#include <stdlib.h>
24#include <string.h>
25
26/*
27 *  IMFS_determine_bytes_per_block
28 */
29int imfs_memfile_bytes_per_block = 0;
30
31static int IMFS_determine_bytes_per_block(
32  int *dest_bytes_per_block,
33  int requested_bytes_per_block,
34  int default_bytes_per_block
35)
36{
37  bool is_valid = false;
38  int bit_mask;
39
40  /*
41   * check, whether requested bytes per block is valid
42   */
43  for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
44    if (bit_mask == requested_bytes_per_block) {
45      is_valid = true;
46      break;
47    }
48    if(bit_mask > requested_bytes_per_block)
49      break;
50  }
51  *dest_bytes_per_block = ((is_valid)
52                           ? requested_bytes_per_block
53                           : default_bytes_per_block);
54  return 0;
55}
56
57int IMFS_initialize_support(
58  rtems_filesystem_mount_table_entry_t *mt_entry,
59  const rtems_filesystem_operations_table *op_table,
60  const IMFS_node_control *const node_controls [IMFS_TYPE_COUNT]
61)
62{
63  static int imfs_instance;
64
65  int rv = 0;
66  IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
67
68  if ( fs_info != NULL ) {
69    IMFS_jnode_t *root_node;
70
71    fs_info->instance = imfs_instance++;
72    memcpy(
73      fs_info->node_controls,
74      node_controls,
75      sizeof( fs_info->node_controls )
76    );
77
78    root_node = IMFS_allocate_node(
79      fs_info,
80      fs_info->node_controls [IMFS_DIRECTORY],
81      "",
82      0,
83      (S_IFDIR | 0755),
84      NULL
85    );
86    if ( root_node != NULL ) {
87      mt_entry->fs_info = fs_info;
88      mt_entry->ops = op_table;
89      mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
90      mt_entry->mt_fs_root->location.node_access = root_node;
91      IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
92    } else {
93      free(fs_info);
94      errno = ENOMEM;
95      rv = -1;
96    }
97  } else {
98    errno = ENOMEM;
99    rv = -1;
100  }
101
102  if ( rv == 0 ) {
103    IMFS_determine_bytes_per_block(
104      &imfs_memfile_bytes_per_block,
105      imfs_rq_memfile_bytes_per_block,
106      IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
107    );
108  }
109
110  return rv;
111}
112
113int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
114{
115  IMFS_jnode_t *node = loc->node_access;
116
117  ++node->reference_count;
118
119  return 0;
120}
121
122void IMFS_node_destroy( IMFS_jnode_t *node )
123{
124  IMFS_assert( node->reference_count == 0 );
125
126  node = (*node->control->node_destroy)( node );
127
128  free( node );
129}
130
131void IMFS_node_free( const rtems_filesystem_location_info_t *loc )
132{
133  IMFS_jnode_t *node = loc->node_access;
134
135  --node->reference_count;
136
137  if ( node->reference_count == 0 ) {
138    IMFS_node_destroy( node );
139  }
140}
141
142IMFS_jnode_t *IMFS_node_initialize_default(
143  IMFS_jnode_t *node,
144  const IMFS_types_union *info
145)
146{
147  return node;
148}
149
150IMFS_jnode_t *IMFS_node_remove_default(
151  IMFS_jnode_t *node
152)
153{
154  return node;
155}
156
157IMFS_jnode_t *IMFS_node_destroy_default( IMFS_jnode_t *node )
158{
159  return node;
160}
161
162const IMFS_node_control IMFS_node_control_default = {
163  .imfs_type = IMFS_INVALID_NODE,
164  .handlers = &rtems_filesystem_handlers_default,
165  .node_initialize = IMFS_node_initialize_default,
166  .node_remove = IMFS_node_remove_default,
167  .node_destroy = IMFS_node_destroy_default
168};
Note: See TracBrowser for help on using the repository browser.