From 871a79f35ba89030c31e12f49ad9872750f27429 Mon Sep 17 00:00:00 2001 From: Tobias Frost Date: Wed, 22 Jun 2022 15:17:48 +0200 Subject: [PATCH] mremap handling in case of error and creating a duplicate mapping. - mremap can fail, in this case the old mapping is retained. - mremap, when oldsize is 0, a new mapping is created without freeing the old one. See mremap(2) for details. --- report.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/report.c b/report.c index e0528a8..88d2895 100644 --- a/report.c +++ b/report.c @@ -369,20 +369,20 @@ static void _report_pvalloc(struct task *task, struct library_symbol *libsym) return report_alloc(task, MT_PVALLOC, ret, size, options.bt_depth, libsym); } -static void report_mremap(struct task *task, struct library_symbol *libsym) -{ - unsigned long addr = fetch_param(task, 0); - unsigned long size = fetch_param(task, 1); - - report_alloc(task, MT_MUNMAP, addr, size, 0, libsym); -} - static void _report_mremap(struct task *task, struct library_symbol *libsym) { - unsigned long size = fetch_param(task, 2); + unsigned long addr = fetch_param(task, 0); + unsigned long oldsize = fetch_param(task, 1); + + unsigned long newsize = fetch_param(task, 2); unsigned long ret = fetch_retval(task); - report_alloc(task, MT_MMAP, ret, size, options.bt_depth, libsym); + if( (void*)ret != MAP_FAILED) { + // mremap(2): if oldsize is zero and the mapping a shared mapping, a new mapping + // (Of the existing) will be created. + if (oldsize) report_alloc(task, MT_MUNMAP, addr, oldsize, 0, libsym); + report_alloc(task, MT_MMAP, ret, newsize, options.bt_depth, libsym); + } } static const struct function flist[] = { @@ -398,7 +398,7 @@ static const struct function flist[] = { { "aligned_alloc", "aligned_alloc", 1, NULL, _report_aligned_alloc }, { "valloc", "valloc", 1, NULL, _report_valloc }, { "pvalloc", "pvalloc", 1, NULL, _report_pvalloc }, - { "mremap", "mremap", 0, report_mremap, _report_mremap }, + { "mremap", "mremap", 0, NULL, _report_mremap }, { "cfree", "cfree", 1, report_free, NULL }, { "reallocarray", "reallocarray", 0, NULL, _report_reallocarray }, #if 0