]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libdwfl: dwfl_linux_proc_find_elf should only return regular files.
authorMark Wielaard <mjw@redhat.com>
Sat, 28 Dec 2013 11:58:10 +0000 (12:58 +0100)
committerMark Wielaard <mjw@redhat.com>
Tue, 31 Dec 2013 12:58:32 +0000 (13:58 +0100)
When the dwfl_linux_proc_find_elf callback is used together with the
dwfl_linux_proc_report callback that reads /proc/PID/maps files we might
see and try to open special character device files that cannot be normally
read and processed by libelf (and might hang the library on the initial
open or read from the file). Make sure we only try to open and return
regular files.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
libdwfl/ChangeLog
libdwfl/linux-proc-maps.c

index 3f9c52554ff6bcbbc35052e46fc7f408face7da0..6c983b2b4111c1daa3317ad4b3735e0905b51a6d 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-28  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-proc-maps.c (dwfl_linux_proc_find_elf): Don't return special
+       character device files, only regular files.
+
 2013-12-24  Mark Wielaard  <mjw@redhat.com>
 
        * linux-core-attach.c (core_next_thread): Check whether thread_argp
index 8863cc88190b6b8c6ee38e58165cb365eff36340..b1f8b331ab93be12859fd1805db848f606540806 100644 (file)
@@ -29,6 +29,7 @@
 #include "libdwflP.h"
 #include <inttypes.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdio_ext.h>
@@ -345,6 +346,14 @@ dwfl_linux_proc_find_elf (Dwfl_Module *mod __attribute__ ((unused)),
 {
   if (module_name[0] == '/')
     {
+      /* When this callback is used together with dwfl_linux_proc_report
+        then we might see mappings of special character devices.  Make
+        sure we only open and return regular files.  Special devices
+        might hang on open or read.  */
+      struct stat sb;
+      if (stat (module_name, &sb) == -1 || (sb.st_mode & S_IFMT) != S_IFREG)
+       return -1;
+
       int fd = open64 (module_name, O_RDONLY);
       if (fd >= 0)
        {