Merge pull request #599 from mmichal10/use-after-free

Fix a few memory management related issues
This commit is contained in:
Robert Baldyga 2021-12-08 21:59:52 +01:00 committed by GitHub
commit e3a58b93fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 4 deletions

View File

@ -332,6 +332,8 @@ int raw_dynamic_update(ocf_cache_t cache,
* RAM DYNAMIC Implementation - Load all * RAM DYNAMIC Implementation - Load all
*/ */
#define RAW_DYNAMIC_LOAD_PAGES 128 #define RAW_DYNAMIC_LOAD_PAGES 128
#define metadata_io_size(__i_page, __pages_total) \
OCF_MIN(RAW_DYNAMIC_LOAD_PAGES, (__pages_total -__i_page))
struct raw_dynamic_load_all_context { struct raw_dynamic_load_all_context {
struct ocf_metadata_raw *raw; struct ocf_metadata_raw *raw;
@ -389,8 +391,7 @@ static int raw_dynamic_load_all_read(struct ocf_request *req)
uint64_t count; uint64_t count;
int result; int result;
count = OCF_MIN(RAW_DYNAMIC_LOAD_PAGES, count = metadata_io_size(context->i_page, raw->ssd_pages);
raw->ssd_pages - context->i_page);
/* Allocate IO */ /* Allocate IO */
context->io = ocf_new_cache_io(context->cache, req->io_queue, context->io = ocf_new_cache_io(context->cache, req->io_queue,
@ -428,7 +429,7 @@ static int raw_dynamic_load_all_update(struct ocf_request *req)
struct raw_dynamic_load_all_context *context = req->priv; struct raw_dynamic_load_all_context *context = req->priv;
struct ocf_metadata_raw *raw = context->raw; struct ocf_metadata_raw *raw = context->raw;
ocf_cache_t cache = context->cache; ocf_cache_t cache = context->cache;
uint64_t count = BYTES_TO_PAGES(context->io->bytes); uint64_t count = metadata_io_size(context->i_page, raw->ssd_pages);
int result = 0; int result = 0;
/* Reset head of data buffer */ /* Reset head of data buffer */

View File

@ -302,12 +302,16 @@ void ocf_core_volume_submit_io(struct ocf_io *io)
ocf_core_update_stats(core, io); ocf_core_update_stats(core, io);
ocf_io_get(io); ocf_io_get(io);
/* Prevent race condition */
ocf_req_get(req);
if (!ocf_core_submit_io_fast(io, req, core, cache)) { if (!ocf_core_submit_io_fast(io, req, core, cache)) {
ocf_core_seq_cutoff_update(core, req); ocf_core_seq_cutoff_update(core, req);
ocf_req_put(req);
return; return;
} }
ocf_req_put(req);
ocf_req_clear_map(req); ocf_req_clear_map(req);
ocf_core_seq_cutoff_update(core, req); ocf_core_seq_cutoff_update(core, req);

View File

@ -84,7 +84,7 @@ void ocf_ctx_unregister_volume_type(ocf_ctx_t ctx, uint8_t type_id)
{ {
OCF_CHECK_NULL(ctx); OCF_CHECK_NULL(ctx);
if (type_id < OCF_VOLUME_TYPE_MAX_USER) if (type_id < OCF_VOLUME_TYPE_MAX)
ocf_ctx_unregister_volume_type_internal(ctx, type_id); ocf_ctx_unregister_volume_type_internal(ctx, type_id);
} }