Fix PR 20345 - call_function_by_hand_dummy: Assertion `tp->thread_fsm == &sm->thread_...
[deliverable/binutils-gdb.git] / gdb / source.c
index e5412bdae5d7855b024a81b82fab54b235582eba..a7038516adc90dd4dd29780d3189970b7dc6592b 100644 (file)
@@ -1,5 +1,5 @@
 /* List lines of source files for GDB, the GNU debugger.
-   Copyright (C) 1986-2015 Free Software Foundation, Inc.
+   Copyright (C) 1986-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -43,6 +43,7 @@
 #include "ui-out.h"
 #include "readline/readline.h"
 #include "common/enum-flags.h"
+#include <algorithm>
 
 #define OPEN_MODE (O_RDONLY | O_BINARY)
 #define FDOPEN_MODE FOPEN_RB
@@ -283,7 +284,7 @@ select_source_symtab (struct symtab *s)
       xfree (sals.sals);
       current_source_pspace = sal.pspace;
       current_source_symtab = sal.symtab;
-      current_source_line = max (sal.line - (lines_to_list - 1), 1);
+      current_source_line = std::max (sal.line - (lines_to_list - 1), 1);
       if (current_source_symtab)
        return;
     }
@@ -685,9 +686,12 @@ source_info (char *ignore, int from_tty)
 }
 \f
 
-/* Return True if the file NAME exists and is a regular file.  */
+/* Return True if the file NAME exists and is a regular file.
+   If the result is false then *ERRNO_PTR is set to a useful value assuming
+   we're expecting a regular file.  */
+
 static int
-is_regular_file (const char *name)
+is_regular_file (const char *name, int *errno_ptr)
 {
   struct stat st;
   const int status = stat (name, &st);
@@ -698,9 +702,21 @@ is_regular_file (const char *name)
      on obscure systems where stat does not work as expected.  */
 
   if (status != 0)
-    return (errno != ENOENT);
+    {
+      if (errno != ENOENT)
+       return 1;
+      *errno_ptr = ENOENT;
+      return 0;
+    }
 
-  return S_ISREG (st.st_mode);
+  if (S_ISREG (st.st_mode))
+    return 1;
+
+  if (S_ISDIR (st.st_mode))
+    *errno_ptr = EISDIR;
+  else
+    *errno_ptr = EINVAL;
+  return 0;
 }
 
 /* Open a file named STRING, searching path PATH (dir names sep by some char)
@@ -775,22 +791,23 @@ openp (const char *path, int opts, const char *string,
 
   if ((opts & OPF_TRY_CWD_FIRST) || IS_ABSOLUTE_PATH (string))
     {
-      int i;
+      int i, reg_file_errno;
 
-      if (is_regular_file (string))
+      if (is_regular_file (string, &reg_file_errno))
        {
          filename = (char *) alloca (strlen (string) + 1);
          strcpy (filename, string);
          fd = gdb_open_cloexec (filename, mode, 0);
          if (fd >= 0)
            goto done;
+         last_errno = errno;
        }
       else
        {
          filename = NULL;
          fd = -1;
+         last_errno = reg_file_errno;
        }
-      last_errno = errno;
 
       if (!(opts & OPF_SEARCH_IN_PATH))
        for (i = 0; string[i]; i++)
@@ -821,6 +838,7 @@ openp (const char *path, int opts, const char *string,
   for (ix = 0; VEC_iterate (char_ptr, dir_vec, ix, dir); ++ix)
     {
       size_t len = strlen (dir);
+      int reg_file_errno;
 
       if (strcmp (dir, "$cwd") == 0)
        {
@@ -879,13 +897,15 @@ openp (const char *path, int opts, const char *string,
       strcat (filename + len, SLASH_STRING);
       strcat (filename, string);
 
-      if (is_regular_file (filename))
+      if (is_regular_file (filename, &reg_file_errno))
        {
          fd = gdb_open_cloexec (filename, mode, 0);
          if (fd >= 0)
            break;
          last_errno = errno;
        }
+      else
+       last_errno = reg_file_errno;
     }
 
   do_cleanups (back_to);
@@ -1159,8 +1179,8 @@ symtab_to_fullname (struct symtab *s)
          if (SYMTAB_DIRNAME (s) == NULL || IS_ABSOLUTE_PATH (s->filename))
            fullname = xstrdup (s->filename);
          else
-           fullname = concat (SYMTAB_DIRNAME (s), SLASH_STRING, s->filename,
-                              NULL);
+           fullname = concat (SYMTAB_DIRNAME (s), SLASH_STRING,
+                              s->filename, (char *) NULL);
 
          back_to = make_cleanup (xfree, fullname);
          s->fullname = rewrite_source_path (fullname);
@@ -1687,7 +1707,7 @@ forward_search_command (char *regex, int from_tty)
          do_cleanups (cleanups);
          print_source_lines (current_source_symtab, line, line + 1, 0);
          set_internalvar_integer (lookup_internalvar ("_"), line);
-         current_source_line = max (line - lines_to_list / 2, 1);
+         current_source_line = std::max (line - lines_to_list / 2, 1);
          return;
        }
       line++;
@@ -1765,7 +1785,7 @@ reverse_search_command (char *regex, int from_tty)
          do_cleanups (cleanups);
          print_source_lines (current_source_symtab, line, line + 1, 0);
          set_internalvar_integer (lookup_internalvar ("_"), line);
-         current_source_line = max (line - lines_to_list / 2, 1);
+         current_source_line = std::max (line - lines_to_list / 2, 1);
          return;
        }
       line--;
This page took 0.026453 seconds and 4 git commands to generate.