2002-01-07 Michael Snyder <msnyder@redhat.com>
authorMichael Snyder <msnyder@vmware.com>
Tue, 8 Jan 2002 00:59:31 +0000 (00:59 +0000)
committerMichael Snyder <msnyder@vmware.com>
Tue, 8 Jan 2002 00:59:31 +0000 (00:59 +0000)
* infptrace.c (GDB_MAX_ALLOCA): New define.
(child_xfer_memory): Use xmalloc/xfree instead of alloca if the
size of the buffer exceeds GDB_MAX_ALLOCA (default 1 megabyte,
can be overridden with whatever value is appropriate to the host).
* infttrace.c (child_xfer_memory): Add FIXME warning about use of
alloca to allocate potentially large buffer.
* rs6000-nat.c (child_xfer_memory): Ditto.
* symm-nat.c (child_xfer_memory): Ditto.
* x86-64-linux-nat.c (child_xfer_memory): Ditto.

gdb/ChangeLog
gdb/infptrace.c
gdb/infttrace.c
gdb/symm-nat.c
gdb/x86-64-linux-nat.c

index 4b5b530fabc42fa2ee3197c83e1a981ac6a596f2..f6b07d1f4b833d361f3eb34c6608fb4d4198aa2b 100644 (file)
@@ -1,3 +1,15 @@
+2002-01-07  Michael Snyder  <msnyder@redhat.com>
+
+       * infptrace.c (GDB_MAX_ALLOCA): New define.
+       (child_xfer_memory): Use xmalloc/xfree instead of alloca if the
+       size of the buffer exceeds GDB_MAX_ALLOCA (default 1 megabyte, 
+       can be overridden with whatever value is appropriate to the host).
+       * infttrace.c (child_xfer_memory): Add FIXME warning about use of
+       alloca to allocate potentially large buffer.
+       * rs6000-nat.c (child_xfer_memory): Ditto.
+       * symm-nat.c (child_xfer_memory): Ditto.
+       * x86-64-linux-nat.c (child_xfer_memory): Ditto.
+
 2002-01-07  Jackie Smith Cashion  <jsmith@redhat.com>
 
        From Nick Clifton  <nickc@redhat.com>
index 9815e05ef0b89a04321d32d3b266a7ab996169c7..c39ca030e78a6f707fe8ff879c65fbc92407f1f8 100644 (file)
@@ -480,6 +480,11 @@ store_inferior_registers (int regno)
 #endif /* !defined (FETCH_INFERIOR_REGISTERS).  */
 \f
 
+/* Set an upper limit on alloca.  */
+#ifndef GDB_MAX_ALLOCA
+#define GDB_MAX_ALLOCA 0x1000
+#endif
+
 #if !defined (CHILD_XFER_MEMORY)
 /* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
    in the NEW_SUN_PTRACE case.  It ought to be straightforward.  But
@@ -506,9 +511,20 @@ child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
   /* Round ending address up; get number of longwords that makes.  */
   int count = ((((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
               / sizeof (PTRACE_XFER_TYPE));
+  int alloc = count * sizeof (PTRACE_XFER_TYPE);
+  PTRACE_XFER_TYPE *buffer;
+  struct cleanup *old_chain = NULL;
+
   /* Allocate buffer of that many longwords.  */
-  PTRACE_XFER_TYPE *buffer =
-    (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
+  if (len < GDB_MAX_ALLOCA)
+    {
+      buffer = (PTRACE_XFER_TYPE *) alloca (alloc);
+    }
+  else
+    {
+      buffer = (PTRACE_XFER_TYPE *) xmalloc (alloc);
+      old_chain = make_cleanup (xfree, buffer);
+    }
 
   if (write)
     {
@@ -573,6 +589,8 @@ child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
              len);
     }
 
+  if (old_chain != NULL)
+    do_cleanups (old_chain);
   return len;
 }
 \f
index c3216a5f0e02543b48a5956f25f757df98ba6ee3..df0a5e579d747586c3f979f18360484e8baa73c2 100644 (file)
@@ -4922,8 +4922,11 @@ child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
   = (((memaddr + len) - addr) + sizeof (TTRACE_XFER_TYPE) - 1)
   / sizeof (TTRACE_XFER_TYPE);
   /* Allocate buffer of that many longwords.  */
+  /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
+     because it uses alloca to allocate a buffer of arbitrary size.
+     For very large xfers, this could crash GDB's stack.  */
   register TTRACE_XFER_TYPE *buffer
-  = (TTRACE_XFER_TYPE *) alloca (count * sizeof (TTRACE_XFER_TYPE));
+    = (TTRACE_XFER_TYPE *) alloca (count * sizeof (TTRACE_XFER_TYPE));
 
   if (write)
     {
index 183fa9198dd2c86dc443591e5a77a3c907e410a0..d6867774310c03362b22ba12cf21409c4a362ffa 100644 (file)
@@ -764,8 +764,11 @@ child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
   = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
   / sizeof (PTRACE_XFER_TYPE);
   /* Allocate buffer of that many longwords.  */
+  /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
+     because it uses alloca to allocate a buffer of arbitrary size.
+     For very large xfers, this could crash GDB's stack.  */
   register PTRACE_XFER_TYPE *buffer
-  = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
+    = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
 
   if (write)
     {
index 268aad583bbc6a915ce0491fac6129442e6274fb..85912e813804fdac74718981ca0531be177711cc 100644 (file)
@@ -147,8 +147,7 @@ fill_gregset (elf_gregset_t * gregsetp, int regno)
 
   for (i = 0; i < X86_64_NUM_GREGS; i++)
     if ((regno == -1 || regno == i))
-      *(regp + x86_64_regmap[i]) =
-       *(elf_greg_t *) & registers[REGISTER_BYTE (i)];
+      read_register_gen (i, regp + x86_64_regmap[i]);
 }
 
 /* Fetch all general-purpose registers from process/thread TID and
@@ -417,6 +416,9 @@ child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
     = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
     / sizeof (PTRACE_XFER_TYPE);
   /* Allocate buffer of that many longwords.  */
+  /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
+     because it uses alloca to allocate a buffer of arbitrary size.
+     For very large xfers, this could crash GDB's stack.  */
   register PTRACE_XFER_TYPE *buffer
     = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));