diff options
author | Sergei Trofimovich <siarheit@google.com> | 2021-11-14 15:50:01 +0000 |
---|---|---|
committer | Sergei Trofimovich <siarheit@google.com> | 2021-11-17 08:13:18 +0000 |
commit | 486f9e20e037f1eea2dce98dc393db60df5feef3 (patch) | |
tree | a424b4616427e24c0f6466f744bfe51b97fd4235 | |
parent | aa95b2d43883666937d31335d0178d2218d9c9aa (diff) | |
download | binutils-gdb-486f9e20e037f1eea2dce98dc393db60df5feef3.tar.gz |
gdb/nat/linux-osdata.c: fix build on gcc-12 (string overfow)
On gcc-12 build fails as:
../../gdbserver/../gdb/nat/linux-osdata.c: In function 'void linux_xfer_osdata_processes(buffer*)':
../../gdbserver/../gdb/nat/linux-osdata.c:330:39: error:
'__builtin___sprintf_chk' may write a terminating nul past the end of the destination [-Werror=format-overflow=]
330 | sprintf (core_str, "%d", i);
| ^
It's an off-by-one case in an infeasible scenario for negative
huge core count. The change switches to std::string for memory
handling.
Tested by running 'info os processes' and checking CPU cores column.
-rw-r--r-- | gdb/nat/linux-osdata.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/gdb/nat/linux-osdata.c b/gdb/nat/linux-osdata.c index 9746d1210fe..91bbe10e515 100644 --- a/gdb/nat/linux-osdata.c +++ b/gdb/nat/linux-osdata.c @@ -302,7 +302,7 @@ linux_xfer_osdata_processes (struct buffer *buffer) char *command_line; int *cores; int task_count; - char *cores_str; + std::string cores_str; int i; if (!isdigit (dp->d_name[0]) @@ -320,19 +320,15 @@ linux_xfer_osdata_processes (struct buffer *buffer) /* Find CPU cores used by the process. */ cores = XCNEWVEC (int, num_cores); task_count = get_cores_used_by_process (pid, cores, num_cores); - cores_str = (char *) xcalloc (task_count, sizeof ("4294967295") + 1); for (i = 0; i < num_cores && task_count > 0; ++i) if (cores[i]) { - char core_str[sizeof ("4294967295")]; - - sprintf (core_str, "%d", i); - strcat (cores_str, core_str); + string_appendf (cores_str, "%d", i); task_count -= cores[i]; if (task_count > 0) - strcat (cores_str, ","); + cores_str += ","; } xfree (cores); @@ -348,10 +344,9 @@ linux_xfer_osdata_processes (struct buffer *buffer) pid, user, command_line ? command_line : "", - cores_str); + cores_str.c_str()); xfree (command_line); - xfree (cores_str); } closedir (dirp); |