X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fcommon%2Flinux-osdata.c;h=805850cbbc907a5bafd87134d80784453f200b23;hb=971dc0b89de28feaa5efade1f1f8675be223fabd;hp=afe3e752f774e2c6227e145fc562bc3e411cee58;hpb=8bdce1ffdf65dc18332dfddb39482f6685cec85a;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/common/linux-osdata.c b/gdb/common/linux-osdata.c index afe3e75..805850c 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-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -26,6 +26,7 @@ #include "linux-osdata.h" #include +#include #include #include #include @@ -41,8 +42,11 @@ #include "xml-utils.h" #include "buffer.h" #include "gdb_assert.h" -#include "gdb_dirent.h" -#include "gdb_stat.h" +#include +#include +#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 @@ -75,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; @@ -124,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'; @@ -133,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) { @@ -164,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) { @@ -253,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 @@ -319,7 +301,7 @@ get_cores_used_by_process (PID_T pid, int *cores) static LONGEST linux_xfer_osdata_processes (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { /* We make the process list snapshot when the object starts to be read. */ static const char *buf; @@ -340,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) @@ -467,7 +449,7 @@ compare_processes (const void *process1, const void *process2) static LONGEST linux_xfer_osdata_processgroups (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { /* We make the process list snapshot when the object starts to be read. */ static const char *buf; @@ -583,7 +565,7 @@ linux_xfer_osdata_processgroups (gdb_byte *readbuf, static LONGEST linux_xfer_osdata_threads (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { /* We make the process list snapshot when the object starts to be read. */ static const char *buf; @@ -697,7 +679,7 @@ linux_xfer_osdata_threads (gdb_byte *readbuf, static LONGEST linux_xfer_osdata_fds (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { /* We make the process list snapshot when the object starts to be read. */ static const char *buf; @@ -758,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'; @@ -881,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]; @@ -891,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; @@ -1011,7 +986,7 @@ print_sockets (unsigned short family, int tcp, struct buffer *buffer) static LONGEST linux_xfer_osdata_isockets (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { static const char *buf; static LONGEST len_avail = -1; @@ -1092,7 +1067,7 @@ group_from_gid (char *group, int maxlen, gid_t gid) static LONGEST linux_xfer_osdata_shm (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { static const char *buf; static LONGEST len_avail = -1; @@ -1109,7 +1084,7 @@ linux_xfer_osdata_shm (gdb_byte *readbuf, buffer_init (&buffer); buffer_grow_str (&buffer, "\n"); - fp = fopen ("/proc/sysvipc/shm", "r"); + fp = gdb_fopen_cloexec ("/proc/sysvipc/shm", "r"); if (fp) { char buf[8192]; @@ -1220,7 +1195,7 @@ linux_xfer_osdata_shm (gdb_byte *readbuf, static LONGEST linux_xfer_osdata_sem (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { static const char *buf; static LONGEST len_avail = -1; @@ -1237,7 +1212,7 @@ linux_xfer_osdata_sem (gdb_byte *readbuf, buffer_init (&buffer); buffer_grow_str (&buffer, "\n"); - fp = fopen ("/proc/sysvipc/sem", "r"); + fp = gdb_fopen_cloexec ("/proc/sysvipc/sem", "r"); if (fp) { char buf[8192]; @@ -1332,7 +1307,7 @@ linux_xfer_osdata_sem (gdb_byte *readbuf, static LONGEST linux_xfer_osdata_msg (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { static const char *buf; static LONGEST len_avail = -1; @@ -1349,7 +1324,7 @@ linux_xfer_osdata_msg (gdb_byte *readbuf, buffer_init (&buffer); buffer_grow_str (&buffer, "\n"); - fp = fopen ("/proc/sysvipc/msg", "r"); + fp = gdb_fopen_cloexec ("/proc/sysvipc/msg", "r"); if (fp) { char buf[8192]; @@ -1458,7 +1433,7 @@ linux_xfer_osdata_msg (gdb_byte *readbuf, static LONGEST linux_xfer_osdata_modules (gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { static const char *buf; static LONGEST len_avail = -1; @@ -1475,7 +1450,7 @@ linux_xfer_osdata_modules (gdb_byte *readbuf, buffer_init (&buffer); buffer_grow_str (&buffer, "\n"); - fp = fopen ("/proc/modules", "r"); + fp = gdb_fopen_cloexec ("/proc/modules", "r"); if (fp) { char buf[8192]; @@ -1484,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, "" "%s" @@ -1544,7 +1542,7 @@ struct osdata_type { char *type; char *title; char *description; - LONGEST (*getter) (gdb_byte *readbuf, ULONGEST offset, LONGEST len); + LONGEST (*getter) (gdb_byte *readbuf, ULONGEST offset, ULONGEST len); } osdata_table[] = { { "processes", "Processes", "Listing of all processes", linux_xfer_osdata_processes }, @@ -1569,7 +1567,7 @@ struct osdata_type { LONGEST linux_common_xfer_osdata (const char *annex, gdb_byte *readbuf, - ULONGEST offset, LONGEST len) + ULONGEST offset, ULONGEST len) { if (!annex || *annex == '\0') {