From fb9a4765b74cc18f25a6b732a66aae952262a7e0 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 24 Jan 2023 12:11:41 +0100 Subject: [PATCH] BUG/MINOR: sink: make sure to always properly unmap a file-backed ring The munmap() call performed on exit was incorrect since it used to apply to the buffer instead of the area, so neither the pointer nor the size were page-aligned. This patches corrects this and also adds a call to msync() since munmap() alone doesn't guarantee that data will be dumped. This should be backported to 2.6. --- src/sink.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/sink.c b/src/sink.c index 862a1ae..0aae5f2 100644 --- a/src/sink.c +++ b/src/sink.c @@ -1392,8 +1392,13 @@ static void sink_deinit() list_for_each_entry_safe(sink, sb, &sink_list, sink_list) { if (sink->type == SINK_TYPE_BUFFER) { - if (sink->store) - munmap(sink->ctx.ring->buf.area, sink->ctx.ring->buf.size); + if (sink->store) { + size_t size = (sink->ctx.ring->buf.size + 4095UL) & -4096UL; + void *area = (sink->ctx.ring->buf.area - sizeof(*sink->ctx.ring)); + + msync(area, size, MS_SYNC); + munmap(area, size); + } else ring_free(sink->ctx.ring); } -- 1.7.10.4