Index: gdb/common/linux-osdata.c |
diff --git a/gdb/common/linux-osdata.c b/gdb/common/linux-osdata.c |
index 6488963c0fcea7c854a103a89b78531684cb6743..90da8995a663e47519b1dcd83a5776e13fa0961a 100644 |
--- a/gdb/common/linux-osdata.c |
+++ b/gdb/common/linux-osdata.c |
@@ -1,6 +1,6 @@ |
/* Linux-specific functions to retrieve OS data. |
- Copyright (C) 2009-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2009-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -26,8 +26,7 @@ |
#include "linux-osdata.h" |
#include <sys/types.h> |
-#include <sys/stat.h> |
-#include <dirent.h> |
+#include <sys/sysinfo.h> |
#include <ctype.h> |
#include <stdlib.h> |
#include <string.h> |
@@ -43,7 +42,11 @@ |
#include "xml-utils.h" |
#include "buffer.h" |
#include "gdb_assert.h" |
-#include "gdb_dirent.h" |
+#include <dirent.h> |
+#include <sys/stat.h> |
+#include "filestuff.h" |
+ |
+#define NAMELEN(dirent) strlen ((dirent)->d_name) |
/* Define PID_T to be a fixed size that is at least as large as pid_t, |
so that reading pid values embedded in /proc works |
@@ -76,7 +79,7 @@ linux_common_core_of_thread (ptid_t ptid) |
sprintf (filename, "/proc/%lld/task/%lld/stat", |
(PID_T) ptid_get_pid (ptid), (PID_T) ptid_get_lwp (ptid)); |
- f = fopen (filename, "r"); |
+ f = gdb_fopen_cloexec (filename, "r"); |
if (!f) |
return -1; |
@@ -125,7 +128,7 @@ static void |
command_from_pid (char *command, int maxlen, PID_T pid) |
{ |
char *stat_path = xstrprintf ("/proc/%lld/stat", pid); |
- FILE *fp = fopen (stat_path, "r"); |
+ FILE *fp = gdb_fopen_cloexec (stat_path, "r"); |
command[0] = '\0'; |
@@ -134,9 +137,9 @@ command_from_pid (char *command, int maxlen, PID_T pid) |
/* sizeof (cmd) should be greater or equal to TASK_COMM_LEN (in |
include/linux/sched.h in the Linux kernel sources) plus two |
(for the brackets). */ |
- char cmd[32]; |
+ char cmd[18]; |
PID_T stat_pid; |
- int items_read = fscanf (fp, "%lld %32s", &stat_pid, cmd); |
+ int items_read = fscanf (fp, "%lld %17s", &stat_pid, cmd); |
if (items_read == 2 && pid == stat_pid) |
{ |
@@ -165,7 +168,7 @@ commandline_from_pid (PID_T pid) |
{ |
char *pathname = xstrprintf ("/proc/%lld/cmdline", pid); |
char *commandline = NULL; |
- FILE *f = fopen (pathname, "r"); |
+ FILE *f = gdb_fopen_cloexec (pathname, "r"); |
if (f) |
{ |
@@ -254,30 +257,8 @@ get_process_owner (uid_t *owner, PID_T pid) |
return -1; |
} |
-/* Returns the number of CPU cores found on the system. */ |
- |
-static int |
-get_number_of_cpu_cores (void) |
-{ |
- int cores = 0; |
- FILE *f = fopen ("/proc/cpuinfo", "r"); |
- |
- while (!feof (f)) |
- { |
- char buf[512]; |
- char *p = fgets (buf, sizeof (buf), f); |
- |
- if (p && strncmp (buf, "processor", 9) == 0) |
- ++cores; |
- } |
- |
- fclose (f); |
- |
- return cores; |
-} |
- |
/* Find the CPU cores used by process PID and return them in CORES. |
- CORES points to an array of at least get_number_of_cpu_cores () |
+ CORES points to an array of at least sysconf(_SC_NPROCESSOR_ONLN) |
elements. */ |
static int |
@@ -341,7 +322,7 @@ linux_xfer_osdata_processes (gdb_byte *readbuf, |
dirp = opendir ("/proc"); |
if (dirp) |
{ |
- const int num_cores = get_number_of_cpu_cores (); |
+ const int num_cores = sysconf (_SC_NPROCESSORS_ONLN); |
struct dirent *dp; |
while ((dp = readdir (dirp)) != NULL) |
@@ -759,7 +740,7 @@ linux_xfer_osdata_fds (gdb_byte *readbuf, |
continue; |
fdname = xstrprintf ("%s/%s", pathname, dp2->d_name); |
- rslt = readlink (fdname, buf, 1000); |
+ rslt = readlink (fdname, buf, sizeof (buf) - 1); |
if (rslt >= 0) |
buf[rslt] = '\0'; |
@@ -882,7 +863,7 @@ print_sockets (unsigned short family, int tcp, struct buffer *buffer) |
else |
return; |
- fp = fopen (proc_file, "r"); |
+ fp = gdb_fopen_cloexec (proc_file, "r"); |
if (fp) |
{ |
char buf[8192]; |
@@ -892,29 +873,22 @@ print_sockets (unsigned short family, int tcp, struct buffer *buffer) |
if (fgets (buf, sizeof (buf), fp)) |
{ |
uid_t uid; |
- unsigned long tlen, inode; |
- int sl, timeout; |
unsigned int local_port, remote_port, state; |
- unsigned int txq, rxq, trun, retn; |
char local_address[NI_MAXHOST], remote_address[NI_MAXHOST]; |
- char extra[512]; |
int result; |
+#if NI_MAXHOST <= 32 |
+#error "local_address and remote_address buffers too small" |
+#endif |
+ |
result = sscanf (buf, |
- "%d: %33[0-9A-F]:%X %33[0-9A-F]:%X %X %X:%X %X:%lX %X %d %d %lu %512s\n", |
- &sl, |
+ "%*d: %32[0-9A-F]:%X %32[0-9A-F]:%X %X %*X:%*X %*X:%*X %*X %d %*d %*u %*s\n", |
local_address, &local_port, |
remote_address, &remote_port, |
&state, |
- &txq, &rxq, |
- &trun, &tlen, |
- &retn, |
- &uid, |
- &timeout, |
- &inode, |
- extra); |
+ &uid); |
- if (result == 15) |
+ if (result == 6) |
{ |
union socket_addr locaddr, remaddr; |
size_t addr_size; |
@@ -1110,7 +1084,7 @@ linux_xfer_osdata_shm (gdb_byte *readbuf, |
buffer_init (&buffer); |
buffer_grow_str (&buffer, "<osdata type=\"shared memory\">\n"); |
- fp = fopen ("/proc/sysvipc/shm", "r"); |
+ fp = gdb_fopen_cloexec ("/proc/sysvipc/shm", "r"); |
if (fp) |
{ |
char buf[8192]; |
@@ -1238,7 +1212,7 @@ linux_xfer_osdata_sem (gdb_byte *readbuf, |
buffer_init (&buffer); |
buffer_grow_str (&buffer, "<osdata type=\"semaphores\">\n"); |
- fp = fopen ("/proc/sysvipc/sem", "r"); |
+ fp = gdb_fopen_cloexec ("/proc/sysvipc/sem", "r"); |
if (fp) |
{ |
char buf[8192]; |
@@ -1350,7 +1324,7 @@ linux_xfer_osdata_msg (gdb_byte *readbuf, |
buffer_init (&buffer); |
buffer_grow_str (&buffer, "<osdata type=\"message queues\">\n"); |
- fp = fopen ("/proc/sysvipc/msg", "r"); |
+ fp = gdb_fopen_cloexec ("/proc/sysvipc/msg", "r"); |
if (fp) |
{ |
char buf[8192]; |
@@ -1476,7 +1450,7 @@ linux_xfer_osdata_modules (gdb_byte *readbuf, |
buffer_init (&buffer); |
buffer_grow_str (&buffer, "<osdata type=\"modules\">\n"); |
- fp = fopen ("/proc/modules", "r"); |
+ fp = gdb_fopen_cloexec ("/proc/modules", "r"); |
if (fp) |
{ |
char buf[8192]; |
@@ -1485,19 +1459,42 @@ linux_xfer_osdata_modules (gdb_byte *readbuf, |
{ |
if (fgets (buf, sizeof (buf), fp)) |
{ |
- char name[64], dependencies[256], status[16]; |
+ char *name, *dependencies, *status, *tmp; |
unsigned int size; |
unsigned long long address; |
int uses; |
- int items_read; |
- |
- items_read = sscanf (buf, |
- "%64s %d %d %256s %16s 0x%llx", |
- name, &size, &uses, |
- dependencies, status, &address); |
- if (items_read == 6) |
- buffer_xml_printf ( |
+ name = strtok (buf, " "); |
+ if (name == NULL) |
+ continue; |
+ |
+ tmp = strtok (NULL, " "); |
+ if (tmp == NULL) |
+ continue; |
+ if (sscanf (tmp, "%u", &size) != 1) |
+ continue; |
+ |
+ tmp = strtok (NULL, " "); |
+ if (tmp == NULL) |
+ continue; |
+ if (sscanf (tmp, "%d", &uses) != 1) |
+ continue; |
+ |
+ dependencies = strtok (NULL, " "); |
+ if (dependencies == NULL) |
+ continue; |
+ |
+ status = strtok (NULL, " "); |
+ if (status == NULL) |
+ continue; |
+ |
+ tmp = strtok (NULL, "\n"); |
+ if (tmp == NULL) |
+ continue; |
+ if (sscanf (tmp, "%llx", &address) != 1) |
+ continue; |
+ |
+ buffer_xml_printf ( |
&buffer, |
"<item>" |
"<column name=\"name\">%s</column>" |