diff --git a/gdb/mipsread.c b/gdb/mipsread.c
index af339e2e1f..046a25bd50 100644
--- a/gdb/mipsread.c
+++ b/gdb/mipsread.c
@@ -180,10 +180,6 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
 {
   bfd *abfd = objfile->obfd;
   struct alphacoff_dynsecinfo si;
-  char *sym_secptr;
-  char *str_secptr;
-  char *dyninfo_secptr;
-  char *got_secptr;
   bfd_size_type sym_secsize;
   bfd_size_type str_secsize;
   bfd_size_type dyninfo_secsize;
@@ -197,7 +193,6 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
   int got_entry_size = 8;
   int dt_mips_local_gotno = -1;
   int dt_mips_gotsym = -1;
-  struct cleanup *cleanups;
 
   /* We currently only know how to handle alpha dynamic symbols.  */
   if (bfd_get_arch (abfd) != bfd_arch_alpha)
@@ -214,43 +209,28 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
   str_secsize = bfd_get_section_size (si.str_sect);
   dyninfo_secsize = bfd_get_section_size (si.dyninfo_sect);
   got_secsize = bfd_get_section_size (si.got_sect);
-  sym_secptr = (char *) xmalloc (sym_secsize);
-  cleanups = make_cleanup (xfree, sym_secptr);
-  str_secptr = (char *) xmalloc (str_secsize);
-  make_cleanup (xfree, str_secptr);
-  dyninfo_secptr = (char *) xmalloc (dyninfo_secsize);
-  make_cleanup (xfree, dyninfo_secptr);
-  got_secptr = (char *) xmalloc (got_secsize);
-  make_cleanup (xfree, got_secptr);
-
-  if (!bfd_get_section_contents (abfd, si.sym_sect, sym_secptr,
+  gdb::def_vector<char> sym_secptr (sym_secsize);
+  gdb::def_vector<char> str_secptr (str_secsize);
+  gdb::def_vector<char> dyninfo_secptr (dyninfo_secsize);
+  gdb::def_vector<char> got_secptr (got_secsize);
+
+  if (!bfd_get_section_contents (abfd, si.sym_sect, sym_secptr.data (),
 				 (file_ptr) 0, sym_secsize))
-    {
-      do_cleanups (cleanups);
-      return;
-    }
-  if (!bfd_get_section_contents (abfd, si.str_sect, str_secptr,
+    return;
+  if (!bfd_get_section_contents (abfd, si.str_sect, str_secptr.data (),
 				 (file_ptr) 0, str_secsize))
-    {
-      do_cleanups (cleanups);
-      return;
-    }
-  if (!bfd_get_section_contents (abfd, si.dyninfo_sect, dyninfo_secptr,
+    return;
+  if (!bfd_get_section_contents (abfd, si.dyninfo_sect, dyninfo_secptr.data (),
 				 (file_ptr) 0, dyninfo_secsize))
-    {
-      do_cleanups (cleanups);
-      return;
-    }
-  if (!bfd_get_section_contents (abfd, si.got_sect, got_secptr,
+    return;
+  if (!bfd_get_section_contents (abfd, si.got_sect, got_secptr.data (),
 				 (file_ptr) 0, got_secsize))
-    {
-      do_cleanups (cleanups);
-      return;
-    }
+    return;
 
   /* Find the number of local GOT entries and the index for the
      first dynamic symbol in the GOT.  */
-  for (dyninfo_p = dyninfo_secptr, dyninfo_end = dyninfo_p + dyninfo_secsize;
+  for ((dyninfo_p = dyninfo_secptr.data (),
+	dyninfo_end = dyninfo_p + dyninfo_secsize);
        dyninfo_p < dyninfo_end;
        dyninfo_p += sizeof (Elfalpha_External_Dyn))
     {
@@ -274,10 +254,7 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
 	}
     }
   if (dt_mips_local_gotno < 0 || dt_mips_gotsym < 0)
-    {
-      do_cleanups (cleanups);
-      return;
-    }
+    return;
 
   /* Scan all dynamic symbols and enter them into the minimal symbol
      table if appropriate.  */
@@ -285,7 +262,7 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
   stripped = (bfd_get_symcount (abfd) == 0);
 
   /* Skip first symbol, which is a null dummy.  */
-  for (i = 1, x_symp = (Elfalpha_External_Sym *) sym_secptr + 1;
+  for (i = 1, x_symp = (Elfalpha_External_Sym *) sym_secptr.data () + 1;
        i < sym_count;
        i++, x_symp++)
     {
@@ -300,7 +277,7 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
       strx = bfd_h_get_32 (abfd, (bfd_byte *) x_symp->st_name);
       if (strx >= str_secsize)
 	continue;
-      name = str_secptr + strx;
+      name = str_secptr.data () + strx;
       if (*name == '\0' || *name == '.')
 	continue;
 
@@ -345,7 +322,8 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
 		continue;
 	      sym_value =
 		bfd_h_get_64 (abfd,
-			      (bfd_byte *) (got_secptr + got_entry_offset));
+			      (bfd_byte *) (got_secptr.data ()
+					    + got_entry_offset));
 	      if (sym_value == 0)
 		continue;
 	    }
@@ -392,8 +370,6 @@ read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
 
       reader.record (name, sym_value, ms_type);
     }
-
-  do_cleanups (cleanups);
 }
 
 /* Initialization.  */
