Cygwin: /proc/<PID>/maps: print real shared region addresses

So far, the addresses printed for the shared regions of a process
were faked.  The assumption was that the shared regions are always
in the same place in all processes, so we just printed the addresses
of the current process.  This is no safe bet.  The only safe bet is
the address of the cygheap.  So keep track of the addresses in the
cygheap and read the addresses from the cygheap of the observed
processes.  Add output for the shared console.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2023-01-17 21:58:06 +01:00
parent 8d318bf142
commit 9ddd48ee1b
5 changed files with 24 additions and 3 deletions

View File

@ -219,6 +219,8 @@ fhandler_console::open_shared_console (HWND hw, HANDLE& h, bool& created)
shared_locations m = created ? SH_SHARED_CONSOLE : SH_JUSTOPEN;
console_state *res = (console_state *)
open_shared (namebuf, 0, h, sizeof (console_state), m, created);
if (m == SH_SHARED_CONSOLE)
cygheap->shared_regions.console_shared_addr = res;
return res;
}

View File

@ -860,8 +860,11 @@ format_process_maps (void *data, char *&destbuf)
/* The heap info on the cygheap is also in the same spot in each process
because the cygheap is located at the same address. */
user_heap_info user_heap;
shared_region_info region_info;
ReadProcessMemory (proc, &cygheap->user_heap, &user_heap,
sizeof user_heap, NULL);
ReadProcessMemory (proc, &cygheap->shared_regions, &region_info,
sizeof region_info, NULL);
off_t len = 0;
@ -1060,12 +1063,14 @@ peb_teb_rinse_repeat:
strcpy (posix_modname, "[peb]");
else if (cur.abase == (char *) &SharedUserData)
strcpy (posix_modname, "[shared-user-data]");
else if (cur.abase == (char *) cygwin_shared)
else if (cur.abase == region_info.cygwin_shared_addr)
strcpy (posix_modname, "[cygwin-shared]");
else if (cur.abase == (char *) user_shared)
else if (cur.abase == region_info.user_shared_addr)
strcpy (posix_modname, "[cygwin-user-shared]");
else if (cur.abase == (char *) *proc_pinfo)
else if (cur.abase == region_info.myself_shared_addr)
strcpy (posix_modname, "[procinfo]");
else if (cur.abase == region_info.console_shared_addr)
strcpy (posix_modname, "[cygwin-shared-console]");
else if (cur.abase == (char *) cygheap)
strcpy (posix_modname, "[cygheap]");
else if (cur.abase == user_heap.base)

View File

@ -302,6 +302,15 @@ struct user_heap_info
void init ();
};
/* This info is maintained for /proc/<PID>/maps ONLY! */
struct shared_region_info
{
void *cygwin_shared_addr;
void *user_shared_addr;
void *myself_shared_addr;
void *console_shared_addr;
};
class cygheap_domain_info
{
PWCHAR pdom_name;
@ -503,6 +512,7 @@ struct init_cygheap: public mini_cygheap
cygheap_ugid_cache ugid_cache;
cygheap_user user;
user_heap_info user_heap;
shared_region_info shared_regions;
mode_t umask;
LONG rlim_as_id;
unsigned long rlim_core;

View File

@ -274,6 +274,7 @@ user_info::create (bool reinit)
debug_printf ("user shared version %x", user_shared->version);
if (reinit)
user_shared->initialize ();
cygheap->shared_regions.user_shared_addr = user_shared;
}
void
@ -315,6 +316,7 @@ shared_info::create ()
SH_CYGWIN_SHARED,
&sec_all_nih);
cygwin_shared->initialize ();
cygheap->shared_regions.cygwin_shared_addr = cygwin_shared;
}
void

View File

@ -466,6 +466,8 @@ pinfo::init (pid_t n, DWORD flag, HANDLE h0)
h = h0;
_pinfo_release ();
}
if (shloc == SH_MYSELF)
cygheap->shared_regions.myself_shared_addr = procinfo;
}
void