[PATCH] cpukit/libblock/src: Add better memory handling in flashdisk.c

Gedare Bloom gedare at rtems.org
Fri Jun 4 22:11:36 UTC 2021


On Fri, Jun 4, 2021 at 1:17 PM Joel Sherrill <joel at rtems.org> wrote:
>
> On the surface, this looks OK to me. But I remember looking at this one
> and wondering if there was any cleanup required because of the various
> subroutine calls as you work down through this method.
>
> Did you look into each of the subroutines called and make sure they
> didn't do further allocations?
>
We hadn't. Now, we took a closer look at this also, and see some more
problems that need to be addressed. The fd variable is a loop
iterator, so we can't just free() it. Should this function cleanup
everything that was attempted and not to return with a partial
initialization in case of a failure? Or, should it allow the partial
initialization of some of the fd's, and just cleanup the last one that
fails (due to out of memory)?


> --joel
>
> On Fri, Jun 4, 2021 at 1:27 PM Harrison Edward Gerber <gerberhe11 at gmail.com> wrote:
>>
>> See also CID 1439298
>>
>> Closes #3570
>> ---
>>  cpukit/libblock/src/flashdisk.c | 16 ++++++++++++++++
>>  1 file changed, 16 insertions(+)
>>
>> diff --git a/cpukit/libblock/src/flashdisk.c b/cpukit/libblock/src/flashdisk.c
>> index 91f99e0d52..4de6ecd807 100644
>> --- a/cpukit/libblock/src/flashdisk.c
>> +++ b/cpukit/libblock/src/flashdisk.c
>> @@ -2486,17 +2486,29 @@ rtems_fdisk_initialize (rtems_device_major_number major,
>>       */
>>      fd->copy_buffer = malloc (c->block_size);
>>      if (!fd->copy_buffer)
>> +    {
>> +      free(fd);
>>        return RTEMS_NO_MEMORY;
>> +    }
>>
>>      fd->blocks = calloc (blocks, sizeof (rtems_fdisk_block_ctl));
>>      if (!fd->blocks)
>> +    {
>> +      free(fd->copy_buffer);
>> +      free(fd);
>>        return RTEMS_NO_MEMORY;
>> +    }
>>
>>      fd->block_count = blocks;
>>
>>      fd->devices = calloc (c->device_count, sizeof (rtems_fdisk_device_ctl));
>>      if (!fd->devices)
>> +    {
>> +      free(fd->blocks);
>> +      free(fd->copy_buffer);
>> +      free(fd);
>>        return RTEMS_NO_MEMORY;
>> +    }
>>
>>      rtems_mutex_init (&fd->lock, "Flash Disk");
>>
>> @@ -2508,6 +2520,7 @@ rtems_fdisk_initialize (rtems_device_major_number major,
>>        free (fd->copy_buffer);
>>        free (fd->blocks);
>>        free (fd->devices);
>> +      free(fd);
>>        rtems_fdisk_error ("disk create phy failed");
>>        return sc;
>>      }
>> @@ -2529,6 +2542,7 @@ rtems_fdisk_initialize (rtems_device_major_number major,
>>          free (fd->copy_buffer);
>>          free (fd->blocks);
>>          free (fd->devices);
>> +        free(fd);
>>          return RTEMS_NO_MEMORY;
>>        }
>>
>> @@ -2564,6 +2578,7 @@ rtems_fdisk_initialize (rtems_device_major_number major,
>>        free (fd->copy_buffer);
>>        free (fd->blocks);
>>        free (fd->devices);
>> +      free(fd);
>>        rtems_fdisk_error ("recovery of disk failed: %s (%d)",
>>                           strerror (ret), ret);
>>        return ret;
>> @@ -2577,6 +2592,7 @@ rtems_fdisk_initialize (rtems_device_major_number major,
>>        free (fd->copy_buffer);
>>        free (fd->blocks);
>>        free (fd->devices);
>> +      free(fd);
>>        rtems_fdisk_error ("compacting of disk failed: %s (%d)",
>>                           strerror (ret), ret);
>>        return ret;
>> --
>> 2.25.1
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list