[PATCH rtems] dosfs: Fix memory leak on failed mounts.

Christian Mauderer christian.mauderer at embedded-brains.de
Mon Aug 3 13:18:48 UTC 2020


PS: Is this a candidate for a backport to 5? How many tickets would I
have to create for it? One for 5 and one for 6?

On 03/08/2020 15:16, Christian Mauderer wrote:
> 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.
> ---
>  cpukit/include/rtems/dosfs.h        | 7 +++++++
>  cpukit/libblock/src/media.c         | 1 +
>  cpukit/libfs/src/dosfs/msdos_init.c | 5 +++++
>  3 files changed, 13 insertions(+)
> 
> diff --git a/cpukit/include/rtems/dosfs.h b/cpukit/include/rtems/dosfs.h
> index 7691ed7e43..a79b00720a 100644
> --- a/cpukit/include/rtems/dosfs.h
> +++ b/cpukit/include/rtems/dosfs.h
> @@ -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;
> diff --git a/cpukit/libblock/src/media.c b/cpukit/libblock/src/media.c
> index 5b2b06b5b2..2964c19881 100644
> --- a/cpukit/libblock/src/media.c
> +++ b/cpukit/libblock/src/media.c
> @@ -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;
>      }
> diff --git a/cpukit/libfs/src/dosfs/msdos_init.c b/cpukit/libfs/src/dosfs/msdos_init.c
> index dc9c76437d..0649258fa7 100644
> --- a/cpukit/libfs/src/dosfs/msdos_init.c
> +++ b/cpukit/libfs/src/dosfs/msdos_init.c
> @@ -102,10 +102,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;
>      }
> @@ -116,6 +118,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;
> 

-- 
--------------------------------------------
embedded brains GmbH
Herr Christian Mauderer
Dornierstr. 4
D-82178 Puchheim
Germany
email: christian.mauderer at embedded-brains.de
Phone: +49-89-18 94 741 - 18
Fax:   +49-89-18 94 741 - 08
PGP: Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.


More information about the devel mailing list