On Sun, Mar 18, 2018 at 01:43:23AM +0100, Mark Wielaard wrote:
[...]
> @@ -115,12 +116,80 @@ __libdwfl_ptrace_attach (pid_t tid, bool
> *tid_was_stoppedp)
> return true;
> }
>
> +#ifdef HAVE_PROCESS_VM_READV
> +static bool
> +read_cached_memory (struct __libdwfl_pid_arg *pid_arg,
> + Dwarf_Addr addr, Dwarf_Word *result)
> +{
> + /* Let the ptrace fallback deal with the corner case of the address
> + possibly crossing a page boundery. */
> + if ((addr & ((Dwarf_Addr)__LIBDWFL_REMOTE_MEM_CACHE_SIZE - 1))
> + > (Dwarf_Addr)__LIBDWFL_REMOTE_MEM_CACHE_SIZE - sizeof (unsigned long))
It looks odd that the variable that is going to be assigned has type
Dwarf_Word, while the size being checked has type unsigned long.
Shouldn't it be sizeof(*result) instead?
> + return false;
> +
> + struct __libdwfl_remote_mem_cache *mem_cache = pid_arg->mem_cache;
> + if (mem_cache == NULL)
> + {
> + size_t mem_cache_size = sizeof (struct __libdwfl_remote_mem_cache);
> + mem_cache = (struct __libdwfl_remote_mem_cache *) malloc
> (mem_cache_size);
> + if (mem_cache == NULL)
> + return false;
> +
> + mem_cache->addr = 0;
> + mem_cache->len = 0;
> + pid_arg->mem_cache = mem_cache;
> + }
> +
> + unsigned char *d;
> + if (addr >= mem_cache->addr && addr - mem_cache->addr < mem_cache->len)
> + {
> + d = &mem_cache->buf[addr - mem_cache->addr];
> + *result = *(unsigned long *) d;
Likewise, shouldn't it be memcpy(result, d, sizeof(*result)) instead?
--
ldv
signature.asc
Description: PGP signature
