Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2023-01-17 23:58:06 +0300
committerCorinna Vinschen <corinna@vinschen.de>2023-01-18 00:00:48 +0300
commit9ddd48ee1b8d736ebbd0b0bdf146ecf96774cd8a (patch)
treedaee5b30416f87373969425f2f76d6d05829cbd5
parent8d318bf142f7d740172099bfa23b6983eb8379ae (diff)
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>
-rw-r--r--winsup/cygwin/fhandler/console.cc2
-rw-r--r--winsup/cygwin/fhandler/process.cc11
-rw-r--r--winsup/cygwin/local_includes/cygheap.h10
-rw-r--r--winsup/cygwin/mm/shared.cc2
-rw-r--r--winsup/cygwin/pinfo.cc2
5 files changed, 24 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
index 68ab43d81..0cbfe4ea4 100644
--- a/winsup/cygwin/fhandler/console.cc
+++ b/winsup/cygwin/fhandler/console.cc
@@ -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;
}
diff --git a/winsup/cygwin/fhandler/process.cc b/winsup/cygwin/fhandler/process.cc
index b0aef2ebe..864e2f4d5 100644
--- a/winsup/cygwin/fhandler/process.cc
+++ b/winsup/cygwin/fhandler/process.cc
@@ -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)
diff --git a/winsup/cygwin/local_includes/cygheap.h b/winsup/cygwin/local_includes/cygheap.h
index ceff0fdcf..d885ca123 100644
--- a/winsup/cygwin/local_includes/cygheap.h
+++ b/winsup/cygwin/local_includes/cygheap.h
@@ -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;
diff --git a/winsup/cygwin/mm/shared.cc b/winsup/cygwin/mm/shared.cc
index d23cc8e0e..d7d6547ec 100644
--- a/winsup/cygwin/mm/shared.cc
+++ b/winsup/cygwin/mm/shared.cc
@@ -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
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
index c05cf2662..37770b643 100644
--- a/winsup/cygwin/pinfo.cc
+++ b/winsup/cygwin/pinfo.cc
@@ -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