[PATCH v2 08/13] support: Add support_count_maps
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Wed Nov 27 13:07:06 GMT 2024
LGTM, some suggestion below.
On 28/07/24 16:03, Florian Weimer wrote:
> ---
> support/Makefile | 2 ++
> support/support.h | 5 +++
> support/support_count_maps.c | 51 +++++++++++++++++++++++++++++++
> support/tst-support_count_maps.c | 52 ++++++++++++++++++++++++++++++++
> 4 files changed, 110 insertions(+)
> create mode 100644 support/support_count_maps.c
> create mode 100644 support/tst-support_count_maps.c
>
> diff --git a/support/Makefile b/support/Makefile
> index aa57207bdc..bc35faa325 100644
> --- a/support/Makefile
> +++ b/support/Makefile
> @@ -53,6 +53,7 @@ libsupport-routines = \
> support_chroot \
> support_copy_file \
> support_copy_file_range \
> + support_count_maps \
> support_create_timer \
> support_descriptor_supports_holes \
> support_descriptors \
> @@ -319,6 +320,7 @@ tests = \
> tst-support-process_state \
> tst-support_blob_repeat \
> tst-support_capture_subprocess \
> + tst-support_count_maps \
> tst-support_descriptors \
> tst-support_format_dns_packet \
> tst-support_quote_blob \
> diff --git a/support/support.h b/support/support.h
> index ba21ec9b5a..5769e8c5f3 100644
> --- a/support/support.h
> +++ b/support/support.h
> @@ -96,6 +96,11 @@ int support_descriptor_supports_holes (int fd);
> WHY_MSG as part of the diagnostic. */
> void support_need_proc (const char *why_msg);
>
> +/* Counts the number of mappings in the process address space.
> + Currently implemented using /proc/self/maps on Linux, so it needs
> + that to exist. */
> +size_t support_count_maps (void);
> +
> /* Error-checking wrapper functions which terminate the process on
> error. */
>
> diff --git a/support/support_count_maps.c b/support/support_count_maps.c
> new file mode 100644
> index 0000000000..2a6dd9fee3
> --- /dev/null
> +++ b/support/support_count_maps.c
> @@ -0,0 +1,51 @@
> +/* Count the number of mappings.
> + Copyright (C) 2024 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <support/support.h>
> +#include <support/check.h>
> +#include <support/xstdio.h>
> +#include <errno.h>
> +
> +size_t
> +support_count_maps (void)
> +{
Maybe add a support_need_proc().
> + FILE *fp = fopen ("/proc/self/maps", "r");
> + if (fp == NULL)
> + {
> + if (errno == ENOENT)
> + FAIL_UNSUPPORTED ("support_count_maps: test needs /proc/self/maps");
> + else
> + FAIL_EXIT1 ("cannot open /proc/self/maps: %m");
> + }
And then you can just use xfopen here.
> + size_t count = 0;
> + while (true)
> + {
> + switch (getc_unlocked (fp))
> + {
> + case EOF:
> + /* Error will be reported by xfclose below. */
> + goto out;
> + case '\n':
> + ++count;
> + break;
> + }
> + }
> + out:
> + xfclose (fp);
> + return count;
> +}
> diff --git a/support/tst-support_count_maps.c b/support/tst-support_count_maps.c
> new file mode 100644
> index 0000000000..e904a00cd4
> --- /dev/null
> +++ b/support/tst-support_count_maps.c
> @@ -0,0 +1,52 @@
> +/* Test counting the number of mappings.
> + Copyright (C) 2024 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <stdio.h>
> +#include <support/support.h>
> +#include <support/check.h>
> +#include <support/xstdio.h>
> +#include <sys/mman.h>
> +#include <support/xunistd.h>
> +
> +static int
> +do_test (void)
> +{
> + long int page_size = xsysconf (_SC_PAGESIZE);
> +
> + size_t initial = support_count_maps ();
> + printf ("info: initial number of maps: %zu\n", initial);
> +
> + void *ptr = xmmap (NULL, 2 * page_size, PROT_READ | PROT_WRITE,
> + MAP_PRIVATE | MAP_ANONYMOUS, -1);
> + size_t one_mapping = support_count_maps ();
> + printf ("info: new number of maps: %zu\n", one_mapping);
> + TEST_COMPARE (initial + 1, one_mapping);
> +
> + /* The mapping gets split due to the protection flags change. */
> + xmprotect (ptr, page_size, PROT_READ);
> + size_t two_mappings = support_count_maps ();
> + TEST_COMPARE (initial + 2, two_mappings);
> +
> + xmunmap (ptr, 2 * page_size);
> + size_t final = support_count_maps ();
> + TEST_COMPARE (initial, final);
> +
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
More information about the Libc-alpha
mailing list