aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2024-03-22 19:46:59 +0000
committerPedro Alves <pedro@palves.net>2024-03-22 19:46:59 +0000
commit30512efab1478ece80cf98d00eb70681afaf7412 (patch)
treea751d6cbf51742b6f9d411ae69b34a7330a36005
parent092ff48583a1bbc1c4c5ca4edbf23c2d8c4a356b (diff)
downloadgdb-30512efab1478ece80cf98d00eb70681afaf7412.zip
gdb-30512efab1478ece80cf98d00eb70681afaf7412.tar.gz
gdb-30512efab1478ece80cf98d00eb70681afaf7412.tar.bz2
windows-nat: Remove SO_NAME_MAX_PATH_SIZE limit
There is no need to limit shared library path sizes to SO_NAME_MAX_PATH_SIZE nowadays. windows_solib::name and windows_solib::original_name are std::strings nowadays, and so are solib::so_name and solib::so_original_name in the core solib code. This commit reworks the code to remove that limit. This also fixes a leak where we were not releasing 'rname' in the realpath branch if the 'rname' string was larger than SO_NAME_MAX_PATH_SIZE. Note: I tested the cygwin_conv_path with a manual hack to force that path, and then stepping through the code. You only get to that path if Windows doesn't report an absolute path for ntdll.dll, and on my machine (running Windows 10), it always does. Approved-By: John Baldwin <jhb@FreeBSD.org> Change-Id: I79e9862d5a7646eebfef7ab5b05b96318a7ca0c5
-rw-r--r--gdb/windows-nat.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index a010112..278bfb0 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -874,22 +874,32 @@ windows_make_so (const char *name, LPVOID load_addr)
}
if (buf[0])
{
- char cname[SO_NAME_MAX_PATH_SIZE];
- cygwin_conv_path (CCP_WIN_W_TO_POSIX, buf, cname,
- SO_NAME_MAX_PATH_SIZE);
- so->name = cname;
+ bool ok = false;
+
+ /* Check how big the output buffer has to be. */
+ ssize_t size = cygwin_conv_path (CCP_WIN_W_TO_POSIX, buf, nullptr, 0);
+ if (size > 0)
+ {
+ /* SIZE includes the null terminator. */
+ so->name.resize (size - 1);
+ if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, buf, so->name.data (),
+ size) == 0)
+ ok = true;
+ }
+ if (!ok)
+ so->name = so->original_name;
}
else
{
char *rname = realpath (name, NULL);
- if (rname && strlen (rname) < SO_NAME_MAX_PATH_SIZE)
+ if (rname != nullptr)
{
so->name = rname;
free (rname);
}
else
{
- warning (_("dll path for \"%s\" too long or inaccessible"), name);
+ warning (_("dll path for \"%s\" inaccessible"), name);
so->name = so->original_name;
}
}