[v3,2/5] Get rid of "gdb_dirbuf" and use "getcwd (NULL, 0)"

Message ID 20170921225926.23132-3-sergiodj@redhat.com
State New, archived
Headers

Commit Message

Sergio Durigan Junior Sept. 21, 2017, 10:59 p.m. UTC
  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.

gdb/ChangeLog:
yyyy-mm-dd  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/cli/cli-cmds.c  | 17 ++++++++++++-----
 gdb/main.c          |  5 ++---
 gdb/mi/mi-cmd-env.c |  8 ++++----
 gdb/top.c           |  3 ---
 gdb/top.h           |  1 -
 5 files changed, 18 insertions(+), 16 deletions(-)
  

Comments

Pedro Alves Sept. 22, 2017, 11:19 a.m. UTC | #1
On 09/21/2017 11:59 PM, Sergio Durigan Junior wrote:
> 
> gdb/ChangeLog:
> yyyy-mm-dd  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.

OK.  And trying the new thing:

Reviewed-by: Pedro Alves <palves@redhat.com>

... provided the nit below is addressed.

You can push patches 1 and 2 now, without waiting for the
rest of the series.

> diff --git a/gdb/mi/mi-cmd-env.c b/gdb/mi/mi-cmd-env.c
> index 977b6e274d..db87ead33d 100644
> --- a/gdb/mi/mi-cmd-env.c
> +++ b/gdb/mi/mi-cmd-env.c
> @@ -73,12 +73,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)))

Please leave the empty line after the comment.  That comment is
logically related to the code above, not the getcwd call.

> +  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 ());
>  }

Thanks,
Pedro Alves
  
Sergio Durigan Junior Sept. 22, 2017, 5:30 p.m. UTC | #2
On Friday, September 22 2017, Pedro Alves wrote:

> On 09/21/2017 11:59 PM, Sergio Durigan Junior wrote:
>> 
>> gdb/ChangeLog:
>> yyyy-mm-dd  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.
>
> OK.  And trying the new thing:
>
> Reviewed-by: Pedro Alves <palves@redhat.com>
>
> ... provided the nit below is addressed.

AFAIU I had to add this to the commit log.  I did this; if this wasn't
correct, I apologize.

>> diff --git a/gdb/mi/mi-cmd-env.c b/gdb/mi/mi-cmd-env.c
>> index 977b6e274d..db87ead33d 100644
>> --- a/gdb/mi/mi-cmd-env.c
>> +++ b/gdb/mi/mi-cmd-env.c
>> @@ -73,12 +73,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)))
>
> Please leave the empty line after the comment.  That comment is
> logically related to the code above, not the getcwd call.

Done.

>> +  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 ());
>>  }
>
> Thanks,
> Pedro Alves

Pushed.

43573013c9836f2b91b74b9b29dac35fdb41e06b

Thanks,
  

Patch

diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 260fd3f635..cbafb13837 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -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]))
diff --git a/gdb/main.c b/gdb/main.c
index fe80511243..66ba75ba21 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -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);
diff --git a/gdb/mi/mi-cmd-env.c b/gdb/mi/mi-cmd-env.c
index 977b6e274d..db87ead33d 100644
--- a/gdb/mi/mi-cmd-env.c
+++ b/gdb/mi/mi-cmd-env.c
@@ -73,12 +73,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.  */
diff --git a/gdb/top.c b/gdb/top.c
index 404e096755..c89e78f243 100644
--- 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;
diff --git a/gdb/top.h b/gdb/top.h
index 45798897f6..6b66083995 100644
--- 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[];