summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Trofimovich <siarheit@google.com>2021-11-14 15:50:01 +0000
committerSergei Trofimovich <siarheit@google.com>2021-11-17 08:13:18 +0000
commit486f9e20e037f1eea2dce98dc393db60df5feef3 (patch)
treea424b4616427e24c0f6466f744bfe51b97fd4235
parentaa95b2d43883666937d31335d0178d2218d9c9aa (diff)
downloadbinutils-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.c13
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);