From: Willy Tarreau Date: Tue, 24 Jan 2023 11:11:41 +0000 (+0100) Subject: BUG/MINOR: sink: make sure to always properly unmap a file-backed ring X-Git-Tag: v2.8-dev3~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fb9a4765b74cc18f25a6b732a66aae952262a7e0;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/sink.c b/src/sink.c index 862a1ae322..0aae5f2a7e 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); }