MDEV-11602 InnoDB leaks foreign key metadata on DDL operations
Essentially revert MDEV-6759, which addressed a double free of memory by removing the freeing altogether, introducing the memory leaks. No double free was observed when running the test suite -DWITH_ASAN. Replace some mem_heap_free(foreign->heap) with dict_foreign_free(foreign) so that the calls can be located and instrumented more easily when needed.
This commit is contained in:
parent
eb4f2e063c
commit
9f863a15b0
@ -1614,6 +1614,7 @@ struct dict_foreign_remove_partial
|
||||
if (table != NULL) {
|
||||
table->referenced_set.erase(foreign);
|
||||
}
|
||||
dict_foreign_free(foreign);
|
||||
}
|
||||
};
|
||||
|
||||
@ -3535,8 +3536,7 @@ dict_foreign_add_to_cache(
|
||||
}
|
||||
|
||||
if (for_in_cache) {
|
||||
/* Free the foreign object */
|
||||
mem_heap_free(foreign->heap);
|
||||
dict_foreign_free(foreign);
|
||||
} else {
|
||||
for_in_cache = foreign;
|
||||
}
|
||||
@ -3564,7 +3564,7 @@ dict_foreign_add_to_cache(
|
||||
" the ones in table.");
|
||||
|
||||
if (for_in_cache == foreign) {
|
||||
mem_heap_free(foreign->heap);
|
||||
dict_foreign_free(foreign);
|
||||
}
|
||||
|
||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||
@ -3620,7 +3620,7 @@ dict_foreign_add_to_cache(
|
||||
be one */
|
||||
}
|
||||
|
||||
mem_heap_free(foreign->heap);
|
||||
dict_foreign_free(foreign);
|
||||
}
|
||||
|
||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||
|
@ -489,7 +489,7 @@ err_len:
|
||||
}
|
||||
|
||||
/* This recieves a dict_foreign_t* that points to a stack variable.
|
||||
So mem_heap_free(foreign->heap) is not used as elsewhere.
|
||||
So dict_foreign_free(foreign) is not used as elsewhere.
|
||||
Since the heap used here is freed elsewhere, foreign->heap
|
||||
is not assigned. */
|
||||
foreign->id = mem_heap_strdupl(heap, (const char*) field, len);
|
||||
|
@ -1614,6 +1614,7 @@ struct dict_foreign_remove_partial
|
||||
if (table != NULL) {
|
||||
table->referenced_set.erase(foreign);
|
||||
}
|
||||
dict_foreign_free(foreign);
|
||||
}
|
||||
};
|
||||
|
||||
@ -3539,8 +3540,7 @@ dict_foreign_add_to_cache(
|
||||
}
|
||||
|
||||
if (for_in_cache) {
|
||||
/* Free the foreign object */
|
||||
mem_heap_free(foreign->heap);
|
||||
dict_foreign_free(foreign);
|
||||
} else {
|
||||
for_in_cache = foreign;
|
||||
}
|
||||
@ -3564,7 +3564,7 @@ dict_foreign_add_to_cache(
|
||||
" the ones in table.");
|
||||
|
||||
if (for_in_cache == foreign) {
|
||||
mem_heap_free(foreign->heap);
|
||||
dict_foreign_free(foreign);
|
||||
}
|
||||
|
||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||
@ -3620,7 +3620,7 @@ dict_foreign_add_to_cache(
|
||||
be one */
|
||||
}
|
||||
|
||||
mem_heap_free(foreign->heap);
|
||||
dict_foreign_free(foreign);
|
||||
}
|
||||
|
||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||
|
@ -491,7 +491,7 @@ err_len:
|
||||
}
|
||||
|
||||
/* This recieves a dict_foreign_t* that points to a stack variable.
|
||||
So mem_heap_free(foreign->heap) is not used as elsewhere.
|
||||
So dict_foreign_free(foreign) is not used as elsewhere.
|
||||
Since the heap used here is freed elsewhere, foreign->heap
|
||||
is not assigned. */
|
||||
foreign->id = mem_heap_strdupl(heap, (const char*) field, len);
|
||||
|
Loading…
x
Reference in New Issue
Block a user