[gcc r15-10748] d: Fix buffer overflow detected with -defaultlib= and -debuglib= [PR123349]

Iain Buclaw ibuclaw@gcc.gnu.org
Thu Jan 29 12:17:54 GMT 2026


https://gcc.gnu.org/g:af39be5b6896b3387fea0a73a5f346238891b9d4

commit r15-10748-gaf39be5b6896b3387fea0a73a5f346238891b9d4
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Thu Jan 29 10:11:43 2026 +0100

    d: Fix buffer overflow detected with -defaultlib= and -debuglib= [PR123349]
    
            PR d/123349
    
    gcc/d/ChangeLog:
    
            * d-spec.cc (lang_specific_driver): Use xstrdup to copy -defaultlib
            and -debuglib argument, and unconditionally free the old value.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/driver_debuglib.d: New test.
            * gdc.dg/driver_defaultlib.d: New test.
    
    (cherry picked from commit a492b8c17118592061cc3834e7a169ca724440cb)

Diff:
---
 gcc/d/d-spec.cc                          | 12 ++++--------
 gcc/testsuite/gdc.dg/driver_debuglib.d   |  2 ++
 gcc/testsuite/gdc.dg/driver_defaultlib.d |  2 ++
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/gcc/d/d-spec.cc b/gcc/d/d-spec.cc
index c78804812e3f..e7c0cf95439c 100644
--- a/gcc/d/d-spec.cc
+++ b/gcc/d/d-spec.cc
@@ -162,24 +162,20 @@ lang_specific_driver (cl_decoded_option **in_decoded_options,
 	  break;
 
 	case OPT_defaultlib_:
-	  if (defaultlib != NULL)
-	    free (CONST_CAST (char *, defaultlib));
+	  free (CONST_CAST (char *, defaultlib));
 	  if (arg != NULL)
 	    {
 	      args[i] |= SKIPOPT;
-	      defaultlib = XNEWVEC (char, strlen (arg));
-	      strcpy (CONST_CAST (char *, defaultlib), arg);
+	      defaultlib = xstrdup (arg);
 	    }
 	  break;
 
 	case OPT_debuglib_:
-	  if (debuglib != NULL)
-	    free (CONST_CAST (char *, debuglib));
+	  free (CONST_CAST (char *, debuglib));
 	  if (arg != NULL)
 	    {
 	      args[i] |= SKIPOPT;
-	      debuglib = XNEWVEC (char, strlen (arg));
-	      strcpy (CONST_CAST (char *, debuglib), arg);
+	      debuglib = xstrdup (arg);
 	    }
 	  break;
 
diff --git a/gcc/testsuite/gdc.dg/driver_debuglib.d b/gcc/testsuite/gdc.dg/driver_debuglib.d
new file mode 100644
index 000000000000..dd06c2af37dc
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/driver_debuglib.d
@@ -0,0 +1,2 @@
+// { dg-do compile }
+// { dg-additional-options "-debuglib=a -debuglib=b" }
diff --git a/gcc/testsuite/gdc.dg/driver_defaultlib.d b/gcc/testsuite/gdc.dg/driver_defaultlib.d
new file mode 100644
index 000000000000..5168be071575
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/driver_defaultlib.d
@@ -0,0 +1,2 @@
+// { dg-do compile }
+// { dg-additional-options "-defaultlib=a -defaultlib=b" }


More information about the Gcc-cvs mailing list