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) {
|
if (table != NULL) {
|
||||||
table->referenced_set.erase(foreign);
|
table->referenced_set.erase(foreign);
|
||||||
}
|
}
|
||||||
|
dict_foreign_free(foreign);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3535,8 +3536,7 @@ dict_foreign_add_to_cache(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (for_in_cache) {
|
if (for_in_cache) {
|
||||||
/* Free the foreign object */
|
dict_foreign_free(foreign);
|
||||||
mem_heap_free(foreign->heap);
|
|
||||||
} else {
|
} else {
|
||||||
for_in_cache = foreign;
|
for_in_cache = foreign;
|
||||||
}
|
}
|
||||||
@ -3564,7 +3564,7 @@ dict_foreign_add_to_cache(
|
|||||||
" the ones in table.");
|
" the ones in table.");
|
||||||
|
|
||||||
if (for_in_cache == foreign) {
|
if (for_in_cache == foreign) {
|
||||||
mem_heap_free(foreign->heap);
|
dict_foreign_free(foreign);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||||
@ -3620,7 +3620,7 @@ dict_foreign_add_to_cache(
|
|||||||
be one */
|
be one */
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_heap_free(foreign->heap);
|
dict_foreign_free(foreign);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||||
|
@ -489,7 +489,7 @@ err_len:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This recieves a dict_foreign_t* that points to a stack variable.
|
/* 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
|
Since the heap used here is freed elsewhere, foreign->heap
|
||||||
is not assigned. */
|
is not assigned. */
|
||||||
foreign->id = mem_heap_strdupl(heap, (const char*) field, len);
|
foreign->id = mem_heap_strdupl(heap, (const char*) field, len);
|
||||||
|
@ -1614,6 +1614,7 @@ struct dict_foreign_remove_partial
|
|||||||
if (table != NULL) {
|
if (table != NULL) {
|
||||||
table->referenced_set.erase(foreign);
|
table->referenced_set.erase(foreign);
|
||||||
}
|
}
|
||||||
|
dict_foreign_free(foreign);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3539,8 +3540,7 @@ dict_foreign_add_to_cache(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (for_in_cache) {
|
if (for_in_cache) {
|
||||||
/* Free the foreign object */
|
dict_foreign_free(foreign);
|
||||||
mem_heap_free(foreign->heap);
|
|
||||||
} else {
|
} else {
|
||||||
for_in_cache = foreign;
|
for_in_cache = foreign;
|
||||||
}
|
}
|
||||||
@ -3564,7 +3564,7 @@ dict_foreign_add_to_cache(
|
|||||||
" the ones in table.");
|
" the ones in table.");
|
||||||
|
|
||||||
if (for_in_cache == foreign) {
|
if (for_in_cache == foreign) {
|
||||||
mem_heap_free(foreign->heap);
|
dict_foreign_free(foreign);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||||
@ -3620,7 +3620,7 @@ dict_foreign_add_to_cache(
|
|||||||
be one */
|
be one */
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_heap_free(foreign->heap);
|
dict_foreign_free(foreign);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(DB_CANNOT_ADD_CONSTRAINT);
|
return(DB_CANNOT_ADD_CONSTRAINT);
|
||||||
|
@ -491,7 +491,7 @@ err_len:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This recieves a dict_foreign_t* that points to a stack variable.
|
/* 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
|
Since the heap used here is freed elsewhere, foreign->heap
|
||||||
is not assigned. */
|
is not assigned. */
|
||||||
foreign->id = mem_heap_strdupl(heap, (const char*) field, len);
|
foreign->id = mem_heap_strdupl(heap, (const char*) field, len);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user