aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergio Durigan Junior <sergiodj@redhat.com>2017-09-11 00:54:33 -0400
committerSergio Durigan Junior <sergiodj@redhat.com>2017-09-22 13:28:16 -0400
commit43573013c9836f2b91b74b9b29dac35fdb41e06b (patch)
tree01586f996ba29e158508fa6b34960008f7ac8efa
parent6ec2e0f5bddc69d55e09fe56792edf7a109ff8ae (diff)
downloadgdb-43573013c9836f2b91b74b9b29dac35fdb41e06b.zip
gdb-43573013c9836f2b91b74b9b29dac35fdb41e06b.tar.gz
gdb-43573013c9836f2b91b74b9b29dac35fdb41e06b.tar.bz2
Get rid of "gdb_dirbuf" and use "getcwd (NULL, 0)"
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.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/cli/cli-cmds.c17
-rw-r--r--gdb/main.c5
-rw-r--r--gdb/mi/mi-cmd-env.c7
-rw-r--r--gdb/top.c3
-rw-r--r--gdb/top.h1
6 files changed, 28 insertions, 15 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1bbf2b8..54eadae 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
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.
* gnulib/config.in: Regenerate.
* gnulib/configure: Regenerate.
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 260fd3f..cbafb13 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 fe80511..66ba75b 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 977b6e2..0d08bb8 100644
--- a/gdb/mi/mi-cmd-env.c
+++ b/gdb/mi/mi-cmd-env.c
@@ -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. */
diff --git a/gdb/top.c b/gdb/top.c
index 404e096..c89e78f 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 4579889..6b66083 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[];