diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index c98ed9435086666d2c7479bd0c350eddab5fa5b4..b845caca0358759c84807527ba86fd3a09c8ef85 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2019-06-10  Christos Zoulas  <christos@zoulas.com>
+
+	PR 24649
+	* arsup.c (ar_open): Use asprintf in place of xmalloc and
+	sprintf.
+
 2019-06-03  Nick Clifton  <nickc@redhat.com>
 
 	Revert:
diff --git a/binutils/arsup.c b/binutils/arsup.c
index 75549bba1189d24053fbaa783fb2e588e858ecae..0836496180a36c7fad96d5e7a187407c1393c593 100644
--- a/binutils/arsup.c
+++ b/binutils/arsup.c
@@ -149,13 +149,20 @@ maybequit (void)
 void
 ar_open (char *name, int t)
 {
-  char *tname = (char *) xmalloc (strlen (name) + 10);
+  char *tname;
   const char *bname = lbasename (name);
   real_name = name;
 
   /* Prepend tmp- to the beginning, to avoid file-name clashes after
      truncation on filesystems with limited namespaces (DOS).  */
-  sprintf (tname, "%.*stmp-%s", (int) (bname - name), name, bname);
+  if (asprintf (&tname, "%.*stmp-%s", (int) (bname - name), name, bname) == -1)
+    {
+      fprintf (stderr, _("%s: Can't allocate memory for temp name (%s)\n"),
+	       program_name, strerror(errno));
+      maybequit ();
+      return;
+    }
+
   obfd = bfd_openw (tname, NULL);
 
   if (!obfd)