* sparc-nat.c (sparc_xfer_wcookie): Try to fetch the cookie using
authorMark Kettenis <kettenis@gnu.org>
Sun, 8 Feb 2004 21:25:41 +0000 (21:25 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sun, 8 Feb 2004 21:25:41 +0000 (21:25 +0000)
the PT_WCOOKIE request.

gdb/ChangeLog
gdb/sparc-nat.c

index f61954fb5425c9ea41e22949dd33d6289e217249..f5e55e46d2e57ab0766649d0f01869c7fc637ca9 100644 (file)
@@ -1,3 +1,8 @@
+2004-02-08  Mark Kettenis  <kettenis@gnu.org>
+
+       * sparc-nat.c (sparc_xfer_wcookie): Try to fetch the cookie using
+       the PT_WCOOKIE request.
+
 2004-02-08  Andrew Cagney  <cagney@redhat.com>
 
        * mips-tdep.c (mips_unwind_pc): New function.
index 477fc975b74f11a689d585482a168f2607d32d04..955e65e31400a9efa4676a8620970f9e3331600c 100644 (file)
@@ -270,8 +270,32 @@ sparc_xfer_wcookie (struct target_ops *ops, enum target_object object,
   /* If PT_WCOOKIE is defined (by <sys/ptrace.h>), assume we're
      running on an OpenBSD release that uses StackGhost (3.1 or
      later).  As of release 3.4, OpenBSD doesn't use a randomized
-     cookie yet.  */
-  wcookie = 0x3;
+     cookie yet, but a future release probably will.  */
+  {
+    int pid;
+
+    pid = TIDGET (inferior_ptid);
+    if (pid == 0)
+      pid = PIDGET (inferior_ptid);
+
+    /* Sanity check.  The proper type for a cookie is register_t, but
+       we can't assume that this type exists on all systems supported
+       by the code in this file.  */
+    gdb_assert (sizeof (wcookie) == sizeof (register_t));
+
+    /* Fetch the cookie.  */
+    if (ptrace (PT_WCOOKIE, pid, (PTRACE_ARG3_TYPE) &wcookie, 0) == -1)
+      {
+       if (errno != EINVAL)
+         perror_with_name ("Couldn't get StackGhost cookie");
+
+       /* Although PT_WCOOKIE is defined on OpenBSD 3.1 and later,
+          the request wasn't implemented until after OpenBSD 3.4.  If
+          the kernel doesn't support the PT_WCOOKIE request, assume
+          we're running on a kernel that uses non-randomized cookies.  */
+       wcookie = 0x3;
+      }
+  }
 #endif /* PT_WCOOKIE */
 
   if (len > sizeof (unsigned long) - offset)