[DTrace-devel] [PATCH 2/5] libproc: fix mapping names low in the address space
Kris Van Hees
kris.van.hees at oracle.com
Sat May 13 05:43:45 UTC 2023
On Mon, Apr 24, 2023 at 08:08:13PM +0100, Nick Alcock via DTrace-devel wrote:
> For reasons which escape my understanding, address ranges in
> /proc/$pid/maps are zero-padded up to eight digits, but filenames in
> /proc/$pid/map_files are not zero-padded at all. Strip the zeroes off
> when deriving the latter from the former.
>
> (Only observable with non-PIE executables, since only they are ever that
> low in the address space.)
>
> Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libproc/Psymtab.c | 25 ++++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/libproc/Psymtab.c b/libproc/Psymtab.c
> index cd55b8cf1678a..a95161884c27a 100644
> --- a/libproc/Psymtab.c
> +++ b/libproc/Psymtab.c
> @@ -53,6 +53,19 @@ static int Pxlookup_by_name_internal(struct ps_prochandle *P, Lmid_t lmid,
> (1 << STT_COMMON) | (1 << STT_TLS))
> #define IS_DATA_TYPE(tp) (((1 << (tp)) & DATA_TYPES) != 0)
>
> +static char *
> +dezerostr(char *str)
> +{
> + size_t i;
> +
> + if (str[0] != '0')
> + return str;
> +
> + i = strspn(str, "0");
> + memmove(str, str + i, strlen(str) - i + 1);
> +
> + return str;
> +}
>
> static ulong_t
> string_hash(const char *key)
> @@ -527,6 +540,7 @@ Pupdate_maps(struct ps_prochandle *P)
> unsigned int minor;
> char perms[5];
> const char *first_space;
> + char *dash;
> map_info_t *mptr;
> prmap_file_t *prf;
> prmap_t *pmptr;
> @@ -545,10 +559,19 @@ Pupdate_maps(struct ps_prochandle *P)
>
> /*
> * Skip anonymous mappings, and special mappings like the stack,
> - * heap, and vdso; also skip on OOM.
> + * heap, and vdso; also skip on OOM. Drop leading zeroes from
> + * the addresses as well (map_files entries lack them).
> */
> first_space = strchr(line, ' ');
> mapaddrname = strndup(line, first_space - line);
> + dezerostr(mapaddrname);
> +
> + dash = strchr(mapaddrname, '-');
> + if (dash) {
> + dash++;
> + dezerostr(dash);
> + }
> +
> if ((fn == NULL) || (mapaddrname == NULL) || (fn[0] == '[')) {
> free(fn);
> free(mapaddrname);
> --
> 2.39.1.268.g9de2f9a303
>
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list