Get rid of "gdb_dirbuf" and use "getcwd (NULL, 0)"
authorSergio Durigan Junior <sergiodj@redhat.com>
Mon, 11 Sep 2017 04:54:33 +0000 (00:54 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Fri, 22 Sep 2017 17:28:16 +0000 (13:28 -0400)
Currently we have "current_directory" and "gdb_dirbuf" globals, which
means that we basically have two possible places to consult when we
want to know GDB's current working directory.

This is not ideal and can lead to confusion.  Moreover, the way we're
using "gdb_difbuf" along with "getcwd" is problematic because we
declare the buffer with "1024" elements hardcoded, which does not take
into account longer pathnames that are possible in many filesystems.
Using "PATH_MAX" would also not be a solution because of portability
problems.  Therefore, the best solution is to rely on the fact that
"getcwd (NULL, 0)" will "do the right thing" and return a
heap-allocated string containing the full path.  With the new "getcwd"
module from gnulib, it is now possible to do that without worrying
about breaking some host.

With this patch "current_directory" is now the only place to check for
GDB's cwd.

Reviewed-by: Pedro Alves <palves@redhat.com>
gdb/ChangeLog:
2017-09-22  Sergio Durigan Junior  <sergiodj@redhat.com>

* cli/cli-cmds.c (pwd_command): Use "getcwd (NULL, 0)".
(cd_command): Likewise.  Free "current_directory" before
assigning to it.
* main.c (captured_main_1): Use "getcwd (NULL, 0)".
* mi/mi-cmd-env.c (mi_cmd_env_pwd): Likewise.
* top.c (gdb_dirbuf): Remove global declaration.
* top.h (gdb_dirbuf): Likewise.

gdb/ChangeLog
gdb/cli/cli-cmds.c
gdb/main.c
gdb/mi/mi-cmd-env.c
gdb/top.c
gdb/top.h

index 1bbf2b8d139e975197255794e890dadeec75993d..54eadaef98f707049f0a3fdcfc4780cbd8e78fe9 100644 (file)
@@ -1,3 +1,13 @@
+2017-09-22  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       * cli/cli-cmds.c (pwd_command): Use "getcwd (NULL, 0)".
+       (cd_command): Likewise.  Free "current_directory" before
+       assigning to it.
+       * main.c (captured_main_1): Use "getcwd (NULL, 0)".
+       * mi/mi-cmd-env.c (mi_cmd_env_pwd): Likewise.
+       * top.c (gdb_dirbuf): Remove global declaration.
+       * top.h (gdb_dirbuf): Likewise.
+
 2017-09-22  Sergio Durigan Junior  <sergiodj@redhat.com>
 
        * gnulib/aclocal.m4: Regenerate.
index 260fd3f63532514db9b44084946a5b4a217971de..cbafb13837f9b44413f28a2c3779c2272c5da28b 100644 (file)
@@ -384,13 +384,16 @@ pwd_command (char *args, int from_tty)
 {
   if (args)
     error (_("The \"pwd\" command does not take an argument: %s"), args);
-  if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
+
+  gdb::unique_xmalloc_ptr<char> cwd (getcwd (NULL, 0));
+
+  if (cwd == NULL)
     error (_("Error finding name of working directory: %s"),
            safe_strerror (errno));
 
-  if (strcmp (gdb_dirbuf, current_directory) != 0)
+  if (strcmp (cwd.get (), current_directory) != 0)
     printf_unfiltered (_("Working directory %s\n (canonically %s).\n"),
-                      current_directory, gdb_dirbuf);
+                      current_directory, cwd.get ());
   else
     printf_unfiltered (_("Working directory %s.\n"), current_directory);
 }
@@ -418,7 +421,8 @@ cd_command (char *dir, int from_tty)
   /* There's too much mess with DOSish names like "d:", "d:.",
      "d:./foo" etc.  Instead of having lots of special #ifdef'ed code,
      simply get the canonicalized name of the current directory.  */
-  dir = getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
+  gdb::unique_xmalloc_ptr<char> cwd (getcwd (NULL, 0));
+  dir = cwd.get ();
 #endif
 
   len = strlen (dir);
@@ -436,7 +440,10 @@ cd_command (char *dir, int from_tty)
 
   dir_holder.reset (savestring (dir, len));
   if (IS_ABSOLUTE_PATH (dir_holder.get ()))
-    current_directory = dir_holder.release ();
+    {
+      xfree (current_directory);
+      current_directory = dir_holder.release ();
+    }
   else
     {
       if (IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]))
index fe80511243bb5bbdcd10af6896d9573c4ec504b8..66ba75ba2104eaee43da3ab9265fe6a07437dfb9 100644 (file)
@@ -549,11 +549,10 @@ captured_main_1 (struct captured_main_args *context)
     (xstrprintf ("%s: warning: ", gdb_program_name));
   warning_pre_print = tmp_warn_preprint.get ();
 
-  if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
+  current_directory = getcwd (NULL, 0);
+  if (current_directory == NULL)
     perror_warning_with_name (_("error finding working directory"));
 
-  current_directory = gdb_dirbuf;
-
   /* Set the sysroot path.  */
   gdb_sysroot = relocate_gdb_directory (TARGET_SYSTEM_ROOT,
                                        TARGET_SYSTEM_ROOT_RELOCATABLE);
index 977b6e274da36dcd2f0c1fa7fd9b62626980d2ec..0d08bb89a9319265455f570990d6ecabf3792b22 100644 (file)
@@ -74,11 +74,12 @@ mi_cmd_env_pwd (const char *command, char **argv, int argc)
      
   /* Otherwise the mi level is 2 or higher.  */
 
-  if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
+  gdb::unique_xmalloc_ptr<char> cwd (getcwd (NULL, 0));
+  if (cwd == NULL)
     error (_("-environment-pwd: error finding name of working directory: %s"),
            safe_strerror (errno));
-    
-  uiout->field_string ("cwd", gdb_dirbuf);
+
+  uiout->field_string ("cwd", cwd.get ());
 }
 
 /* Change working directory.  */
index 404e096755c51b1301f2687a93062546ae45f2c8..c89e78f2439c24c0cfd70c08f766b498668faa85 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -133,9 +133,6 @@ show_confirm (struct ui_file *file, int from_tty,
 
 char *current_directory;
 
-/* The directory name is actually stored here (usually).  */
-char gdb_dirbuf[1024];
-
 /* The last command line executed on the console.  Used for command
    repetitions.  */
 char *saved_command_line;
index 45798897f694ab8ce33abccbc01221cb8609bbe0..6b660839959b64fb3248e1bbd62c3c2d992f785e 100644 (file)
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -219,7 +219,6 @@ extern void ui_unregister_input_event_handler (struct ui *ui);
 /* From top.c.  */
 extern char *saved_command_line;
 extern int confirm;
-extern char gdb_dirbuf[1024];
 extern int inhibit_gdbinit;
 extern const char gdbinit[];