libctf, archive: stop ctf_arc_bufopen triggering crazy unmaps
authorNick Alcock <nick.alcock@oracle.com>
Tue, 2 Jun 2020 19:55:05 +0000 (20:55 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Wed, 22 Jul 2020 16:57:33 +0000 (17:57 +0100)
commit601e455b758b7075d3027c030b9bd60f7b7face5
tree655696f41764e9a7e7b6a5e76b5a87b52ffe6f42
parent96e3ec29664810995d6d7d3b6fd6ae2d19c532bd
libctf, archive: stop ctf_arc_bufopen triggering crazy unmaps

The archive machinery mmap()s its archives when possible: so it arranges
to do appropriately-sized unmaps by recording the unmap length in the
ctfa_magic value and unmapping that.

This brilliant (horrible) trick works less well when ctf_arc_bufopen is
called with an existing buffer (which might be a readonly mapping).
ctf_arc_bufopen always returns a ctf_archive_t wrapper, so record in
there the necessity to not unmap anything when a bufopen'ed archive is
closed again.

libctf/
* ctf-impl.h (struct ctf_archive_internal)
<ctfi_unmap_on_close>: New.
(ctf_new_archive_internal): Adjust.
* ctf-archive.c (ctf_new_archive_internal): Likewise.
Initialize ctfi_unmap_on_close.  Adjust error path.
(ctf_arc_bufopen): Adjust ctf_new_archive_internal call
(unmap_on_close is 0).
(ctf_arc_close): Only unmap if ctfi_unmap_on_close.
* ctf-open-bfd.c (ctf_fdopen): Adjust.
libctf/ChangeLog
libctf/ctf-archive.c
libctf/ctf-impl.h
libctf/ctf-open-bfd.c