Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: gdb-patches@sourceware.org
Cc: rustyBSD@gmx.fr
Subject: [PATCH] Fix readlink calls in GDB
Date: Mon, 26 Nov 2012 14:20:00 -0000	[thread overview]
Message-ID: <20121126142036.10142.97678.stgit@brno.lan> (raw)

This is largely based on a patch Maxime sent me, to fix readlink calls
in GDB.

Several readlink calls in gdb are wrong.  readlink doesn't append the
terminating nul, so if we're going to need to do that, we need to pass
'sizeof (buf) - 1' as buffer size.

See:

https://www.securecoding.cert.org/confluence/display/seccode/POS30-C.+Use+the+readlink%28%29+function+properly

Tested on x86_64 Fedora 17, and checked in.

gdb/
2012-11-26  Maxime Villard  <rustyBSD@gmx.fr>
	    Pedro Alves  <palves@redhat.com>

	* common/linux-osdata.c (linux_xfer_osdata_fds): Decrease buffer
	size parameter passed to readlink by one byte.
	* fbsd-nat.c (fbsd_pid_to_exec_file): Ditto.
	* linux-nat.c (linux_child_pid_to_exec_file): Ditto.
	* nbsd-nat.c (nbsd_pid_to_exec_file): Ditto.
	* inf-child.c (inf_child_fileio_readlink): Decrease local buffer's
	size by one byte.

gdb/gdbserver/
2012-11-26  Maxime Villard  <rustyBSD@gmx.fr>

	* hostio.c (handle_readlink): Decrease buffer size
	parameter passed to readlink by one byte.
---
 gdb/common/linux-osdata.c |    2 +-
 gdb/fbsd-nat.c            |    2 +-
 gdb/gdbserver/hostio.c    |    2 +-
 gdb/inf-child.c           |    2 +-
 gdb/linux-nat.c           |    2 +-
 gdb/nbsd-nat.c            |    2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/gdb/common/linux-osdata.c b/gdb/common/linux-osdata.c
index d54f9d3..b275495 100644
--- a/gdb/common/linux-osdata.c
+++ b/gdb/common/linux-osdata.c
@@ -737,7 +737,7 @@ linux_xfer_osdata_fds (gdb_byte *readbuf,
 			    continue;
 
 			  fdname = xstrprintf ("%s/%s", pathname, dp2->d_name);
-			  rslt = readlink (fdname, buf, 1000);
+			  rslt = readlink (fdname, buf, sizeof (buf) - 1);
 			  if (rslt >= 0)
 			    buf[rslt] = '\0';
 
diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c
index 254a01a..5eaecdd 100644
--- a/gdb/fbsd-nat.c
+++ b/gdb/fbsd-nat.c
@@ -55,7 +55,7 @@ fbsd_pid_to_exec_file (int pid)
 #endif
 
   path = xstrprintf ("/proc/%d/file", pid);
-  if (readlink (path, buf, MAXPATHLEN) == -1)
+  if (readlink (path, buf, MAXPATHLEN - 1) == -1)
     {
       xfree (buf);
       buf = NULL;
diff --git a/gdb/gdbserver/hostio.c b/gdb/gdbserver/hostio.c
index 72e334c..e89e100 100644
--- a/gdb/gdbserver/hostio.c
+++ b/gdb/gdbserver/hostio.c
@@ -483,7 +483,7 @@ handle_readlink (char *own_buf, int *new_packet_len)
       return;
     }
 
-  ret = readlink (filename, linkname, sizeof linkname);
+  ret = readlink (filename, linkname, sizeof (linkname) - 1);
   if (ret == -1)
     {
       hostio_error (own_buf);
diff --git a/gdb/inf-child.c b/gdb/inf-child.c
index ae2dd1e..3530e75 100644
--- a/gdb/inf-child.c
+++ b/gdb/inf-child.c
@@ -346,7 +346,7 @@ inf_child_fileio_readlink (const char *filename, int *target_errno)
   /* We support readlink only on systems that also provide a compile-time
      maximum path length (MAXPATHLEN), at least for now.  */
 #if defined (HAVE_READLINK) && defined (MAXPATHLEN)
-  char buf[MAXPATHLEN];
+  char buf[MAXPATHLEN - 1];
   int len;
   char *ret;
 
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 45f7e24..f5ca977 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -4319,7 +4319,7 @@ linux_child_pid_to_exec_file (int pid)
   memset (name2, 0, MAXPATHLEN);
 
   sprintf (name1, "/proc/%d/exe", pid);
-  if (readlink (name1, name2, MAXPATHLEN) > 0)
+  if (readlink (name1, name2, MAXPATHLEN - 1) > 0)
     return name2;
   else
     return name1;
diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c
index 14b562f..7f5df66 100644
--- a/gdb/nbsd-nat.c
+++ b/gdb/nbsd-nat.c
@@ -34,7 +34,7 @@ nbsd_pid_to_exec_file (int pid)
   char *path;
 
   path = xstrprintf ("/proc/%d/exe", pid);
-  if (readlink (path, buf, MAXPATHLEN) == -1)
+  if (readlink (path, buf, MAXPATHLEN - 1) == -1)
     {
       xfree (buf);
       buf = NULL;


             reply	other threads:[~2012-11-26 14:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-26 14:20 Pedro Alves [this message]
2012-11-26 14:43 ` Pierre Muller
2012-11-26 15:16   ` Pedro Alves
2012-11-26 15:31     ` Pierre Muller
2012-11-26 16:12       ` Pedro Alves
2012-11-26 16:33         ` Pierre Muller
2012-11-26 16:54           ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121126142036.10142.97678.stgit@brno.lan \
    --to=palves@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=rustyBSD@gmx.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox