Changeset b434dc1 in rtems


Ignore:
Timestamp:
10/12/20 06:09:13 (3 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
4763ef8
Parents:
8111a6ba
git-author:
Sebastian Huber <sebastian.huber@…> (10/12/20 06:09:13)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/12/20 06:21:42)
Message:

libblock: Fix sparse disk

The qsort() in sparse_disk_get_new_block() may move the appended key
which invalidates the pointer.

Close #4142.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libblock/src/sparse-disk.c

    r8111a6ba rb434dc1  
    112112}
    113113
     114static rtems_sparse_disk_key *sparse_disk_find_block(
     115  const rtems_sparse_disk *sparse_disk,
     116  rtems_blkdev_bnum        block
     117)
     118{
     119  rtems_sparse_disk_key key = { .block = block };
     120
     121  return bsearch(
     122    &key,
     123    sparse_disk->key_table,
     124    sparse_disk->used_count,
     125    sizeof( rtems_sparse_disk_key ),
     126    sparse_disk_compare
     127  );
     128}
     129
    114130static rtems_sparse_disk_key *sparse_disk_get_new_block(
    115131  rtems_sparse_disk      *sparse_disk,
    116   const rtems_blkdev_bnum block )
     132  const rtems_blkdev_bnum block
     133)
    117134{
    118135  rtems_sparse_disk_key *key;
    119136
    120   if ( sparse_disk->used_count < sparse_disk->blocks_with_buffer ) {
    121     key        = &sparse_disk->key_table[sparse_disk->used_count];
    122     key->block = block;
    123     ++sparse_disk->used_count;
    124     qsort( sparse_disk->key_table, sparse_disk->used_count,
    125            sizeof( rtems_sparse_disk_key ), sparse_disk_compare );
    126   } else
     137  if ( sparse_disk->used_count >= sparse_disk->blocks_with_buffer ) {
    127138    return NULL;
    128 
    129   return key;
     139  }
     140
     141  key = &sparse_disk->key_table[ sparse_disk->used_count ];
     142  key->block = block;
     143  ++sparse_disk->used_count;
     144  qsort(
     145    sparse_disk->key_table,
     146    sparse_disk->used_count,
     147    sizeof( rtems_sparse_disk_key ),
     148    sparse_disk_compare
     149  );
     150  return sparse_disk_find_block( sparse_disk, block );
    130151}
    131152
     
    136157  const size_t             buffer_size )
    137158{
     159  size_t                 bytes_to_copy = sparse_disk->media_block_size;
    138160  rtems_sparse_disk_key *key;
    139   rtems_sparse_disk_key  block_key = {
    140     .block = block,
    141     .data  = NULL
    142   };
    143   size_t                 bytes_to_copy = sparse_disk->media_block_size;
    144161
    145162  if ( buffer_size < bytes_to_copy )
    146163    bytes_to_copy = buffer_size;
    147164
    148   key = bsearch(
    149     &block_key,
    150     sparse_disk->key_table,
    151     sparse_disk->used_count,
    152     sizeof( rtems_sparse_disk_key ),
    153     sparse_disk_compare
    154     );
     165  key = sparse_disk_find_block( sparse_disk, block );
    155166
    156167  if ( NULL != key )
     
    168179  const size_t            buffer_size )
    169180{
    170   unsigned int           i;
     181  size_t                 bytes_to_copy = sparse_disk->media_block_size;
    171182  bool                   block_needs_writing = false;
    172183  rtems_sparse_disk_key *key;
    173   rtems_sparse_disk_key  block_key           = {
    174     .block = block,
    175     .data  = NULL
    176   };
    177   size_t                 bytes_to_copy = sparse_disk->media_block_size;
     184  size_t                 i;
    178185
    179186  if ( buffer_size < bytes_to_copy )
     
    184191   */
    185192
    186   key = bsearch(
    187     &block_key,
    188     sparse_disk->key_table,
    189     sparse_disk->used_count,
    190     sizeof( rtems_sparse_disk_key ),
    191     sparse_disk_compare
    192     );
     193  key = sparse_disk_find_block( sparse_disk, block );
    193194
    194195  if ( NULL == key ) {
Note: See TracChangeset for help on using the changeset viewer.