mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-11-16 12:34:45 +00:00
dosfs: Fix memory leak on failed mounts.
Currently if mount fails, a converter isn't destroyed. We have to take care of two cases: 1. The user doesn't provide a converter. In this case mounting a dosfs creates a default converter. This patch makes sure that the converter is destroyed again if mount failes for this case. 2. The user provides a converter. In this case it's not sure that the dosfs specific routines are reached because mount can fail before that. Therefore the user has to destroy the converter himself again. This patch adds a documentation for that and implements it in the media server. Closes #4041.
This commit is contained in:
@@ -214,6 +214,9 @@ typedef struct {
|
||||
/**
|
||||
* @brief Converter implementation for new file system instance.
|
||||
*
|
||||
* Note: If you pass a converter to mount, you have to destroy it yourself if
|
||||
* mount failed. In a good case it is destroyed at unmount.
|
||||
*
|
||||
* Before converters have been added to the RTEMS implementation of the FAT
|
||||
* file system, the implementation was:
|
||||
* - Short names were saved in code page format (as is still the case).
|
||||
@@ -270,6 +273,10 @@ typedef struct {
|
||||
* RTEMS_FILESYSTEM_READ_WRITE,
|
||||
* &mount_opts
|
||||
* );
|
||||
*
|
||||
* if (rv != 0) {
|
||||
* (*mount_opts.converter->handler->destroy)(mount_opts.converter);
|
||||
* }
|
||||
* } else {
|
||||
* rv = -1;
|
||||
* errno = ENOMEM;
|
||||
|
||||
@@ -504,6 +504,7 @@ static rtems_status_code mount_worker(
|
||||
if (rv != 0) {
|
||||
rmdir(mount_path);
|
||||
free(mount_path);
|
||||
(*mount_options.converter->handler->destroy)(mount_options.converter);
|
||||
|
||||
return RTEMS_IO_ERROR;
|
||||
}
|
||||
|
||||
@@ -103,10 +103,12 @@ int rtems_dosfs_initialize(
|
||||
int rc = 0;
|
||||
const rtems_dosfs_mount_options *mount_options = data;
|
||||
rtems_dosfs_convert_control *converter;
|
||||
bool converter_created = false;
|
||||
|
||||
|
||||
if (mount_options == NULL || mount_options->converter == NULL) {
|
||||
converter = rtems_dosfs_create_default_converter();
|
||||
converter_created = true;
|
||||
} else {
|
||||
converter = mount_options->converter;
|
||||
}
|
||||
@@ -117,6 +119,9 @@ int rtems_dosfs_initialize(
|
||||
&msdos_file_handlers,
|
||||
&msdos_dir_handlers,
|
||||
converter);
|
||||
if (rc != 0 && converter_created) {
|
||||
(*converter->handler->destroy)(converter);
|
||||
}
|
||||
} else {
|
||||
errno = ENOMEM;
|
||||
rc = -1;
|
||||
|
||||
Reference in New Issue
Block a user